• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zwracanie referencji do obiektu string zawieranego w klasie

VPS Starter Arubacloud
0 głosów
136 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez amtrax Dyskutant (9,630 p.)

Cześć, 

mam klasę :

#ifndef CLASS_H_INCLUDED
#define CLASS_H_INCLUDED
 #include <valarray>
 typedef std::valarray<int> ArrayInt;

class Wine
{
private:
    std::string label;
    ArrayInt Pair; 
    ArrayInt Bottles; 
public:
    Wine (const char * l , int y, const int yr[],const int bot[]):Pair(yr,y),Bottles(bot,y),label(l){}
    Wine (const char * l, int y):Pair(y),Bottles(y),label(l){}
    GetBottles();
    std::string & Label();
    sum();


};

#endif // CLASS_H_INCLUDED

W metodzie Label(), potrzebuje zwrocić referencję do obiektu string 'label'. Niestety po zapisaniu metody w takim sposób, program nie chce działać. 

std::string & Wine::Label()
{
    return label;
}

Jak mogę rozwiązać problem? 

Pozdrowienia 

komentarz 21 kwietnia 2020 przez tkz Nałogowiec (42,020 p.)
Jeżeli string będzie dłuższy niż ileś tam znaków, zależnie do platformy, to nie zadziała ze względu na short string optimization.

Odchodząc od tematu błędów wynikających z implementacji strigna. Co znaczy "nie działa"?
komentarz 21 kwietnia 2020 przez amtrax Dyskutant (9,630 p.)
Napis do testów był krótki 4-5 znaków.

Program pokazuje, że składowa jest prywatna.
Jak mogę ją zwrócić?
komentarz 21 kwietnia 2020 przez tkz Nałogowiec (42,020 p.)
#include <iostream>
#include <string>
class Wine
{
private:
    std::string label;

public:
    explicit Wine(const std::string& label):label{label}{};
    const std::string & Label() const
    {
        return label;
    }
};

int main()
{
    std::string text("ala");
    Wine wine(text);
    std::cout<<wine.Label();
}

Nieco uprościłem kod na potrzeby pokazania. 

komentarz 21 kwietnia 2020 przez j23 Mędrzec (195,220 p.)

@tkz, a co ma short string optimization do zwracania przez referencję?

komentarz 21 kwietnia 2020 przez tkz Nałogowiec (42,020 p.)
#include <iostream>
#include <string>

class Test {
public:
  Test(const std::string& _text) : text(_text) {}
  const std::string& getText()  {
    return text;
  }

private:
  std::string text;
};

int main() 
{  
    {   
        const std::string text = "0932450usdijhfs";
        const std::string password = "password";
        const auto& savedText = Test(text).getText();
        std::cout << savedText << "\n";
    }
    {   
        const std::string text = "0932450usdijhf423423423s";
        const std::string password = "password";
        const auto& savedText = Test(text).getText();
        std::cout << savedText << "\n";
    }
}

Myślałem o takim przykładzie. 

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 172 wizyt
0 głosów
4 odpowiedzi 473 wizyt
pytanie zadane 29 grudnia 2016 w C i C++ przez Adrian Stasiak Początkujący (410 p.)
0 głosów
1 odpowiedź 600 wizyt
pytanie zadane 9 maja 2017 w C# przez BlackMoon Obywatel (1,730 p.)

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,309 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...