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

Inicjalizacja listą (C++)

Object Storage Arubacloud
–1 głos
257 wizyt
pytanie zadane 9 października 2018 w C i C++ przez Sic Dyskutant (8,510 p.)

Witam napisałem program, który jest pewny sprawny mimo to mam kilka pytań, ponieważ podczas jego tworzenia natchnąłem się na pewnien błąd, który mnie zaciekawił.

Oto kod:

#include <iostream>
#include <string>

class Trash
{
        private:
                std::string text;
        public:
                Trash(std::string name) : text(name) {
                        if(name.empty())
                                std::cout << "Zawartość lini jest pusta\n";
                        else
                                std::cout << "Zawartość linii: " << name << std::endl;
                }
};

int main()
{
        Trash f_object("");
        return 0;
}

Mianowicie chodzi tutaj o inicjalizacje listą, która została dokonana wewnątrz klasy i działa prawidłowo. Jednak tworząc program i definując kontruktor robiłem to poza klasą korzystając z jej zasięgu (::) i to spowodowało błąd kompilacji. Moje pytanie brzmi dlaczego skoro zrobiłem dokładnie to samo ?

1
komentarz 9 października 2018 przez j23 Mędrzec (194,920 p.)

Zawsze podawaj treść błędu!

 

Pokaż kod, który powoduje błąd.

1 odpowiedź

–2 głosów
odpowiedź 9 października 2018 przez Bondrusiek Maniak (61,370 p.)

Witam,

nie możesz zdefiniować w taki sposób ponieważ zmienna ma zakres prywatny. Aby zaincjalizować listę musisz ustawić zmienną z zakresem publicznym.

#include <iostream>
#include <string>

class Trash
{
        public:
                std::string text;
        public:
                Trash(std::string name);
};

Trash::Trash(std::string name) : text(name) {
        if(name.empty())
                std::cout << "Zawartość lini jest pusta\n";
        else
                std::cout << "Zawartość linii: " << name << std::endl;
}

int main()
{
        Trash f_object("");
        return 0;
}

 

komentarz 9 października 2018 przez j23 Mędrzec (194,920 p.)
A gdzie jest napisane, że zmienna nie może być prywatna, by mogła być na liście inicjalizacyjnej?
komentarz 9 października 2018 przez Sic Dyskutant (8,510 p.)
To skoro nie zasięg jest tutaj problemem to co ?
1
komentarz 9 października 2018 przez j23 Mędrzec (194,920 p.)
Nie wiem, bo nie widzę ani kodu, który powoduje błąd, ani treści błędu.
komentarz 9 października 2018 przez Sic Dyskutant (8,510 p.)
edycja 9 października 2018 przez Sic

Przepraszam bardzo, ale w jakiś sposób sam doszedłem do rozwiązania tego problemu.

Mimo to mam lekki problem z jednym warunkiem po rozbudowaniu programu

#include <string>

class Trash
{
        private:
                std::string text;
        public:
                Trash(std::string);
};

Trash::Trash(std::string name) : text(name) {
        if(name.empty())
                std::cout << "Zawartość lini jest pusta\n";
        else
        {

                std::cout << "Zawartość linii: " << name;
                if(name.size() < 5 && name.size() > 1)
                        std::cout << "\nLinia zawiera: " << name.size() << " znaki\n";
                else if(name.size() == 1)
                        std::cout << "\nLinia zawiera: " << name.size() << " znak\n";
                else
                        std::cout << "\nLinia zawiera: " << name.size() << " znaków\n";
        }
}

int main()
{
        std::string signs;
        std::cout << "Wprowadź tekst lub naciśnij enter (q kończy): ";
        while(std::cin >> signs)
        {
                if(signs == "q") break;
                if(signs == "\n") continue;
                Trash f_object(signs);
                std::cout << "Wprowadź tekst lub naciśnij enter (q kończy): ";
        }
        std::cout << "Koniec programu!\n";
        return 0;
}

Chodzi tutaj dokładnie o:

if(signs == "\n") continue;

Chce, żeby po naciśnięciu Enter program sprawdził zawartość linii pokazując, że jest pusta (jeżeli nie ma w niej nic więcej oczywiście).

1
komentarz 9 października 2018 przez j23 Mędrzec (194,920 p.)

Użyj std::getline, bo operator >> nie może zwrócić pustego stringa, tym bardziej zawierającego \n.

komentarz 9 października 2018 przez Sic Dyskutant (8,510 p.)
Dziękuję nie wiedziałem o tym. Czyli dla string lepiej korzystać z getline ?
komentarz 9 października 2018 przez j23 Mędrzec (194,920 p.)

Czasem lepiej, czasem nie. Zależy, co chcesz zrobić. Jak chcesz czytać liniami, używasz std::getline, a jak słowami - używasz operatora >>.

komentarz 9 października 2018 przez Sic Dyskutant (8,510 p.)
No dobra. A czy korzystanie z obu tych technik na różnych etapach (z tą samą zmienną) jest rozsądne ?
komentarz 10 października 2018 przez j23 Mędrzec (194,920 p.)
edycja 10 października 2018 przez j23

A dlaczego miałoby być nierozsądne?

 

Dodam, że oczywiście możesz użyć operatora >> tak, jak masz teraz, tylko wywal warunek z linii 34, bo jest bez sensu.

komentarz 10 października 2018 przez Sic Dyskutant (8,510 p.)
Usunąłem go jak mi poleciłeś, ale wykorzystałem std::getline(). ponieważ wtedy program działał prawidłowo.

Podobne pytania

+1 głos
1 odpowiedź 113 wizyt
pytanie zadane 26 czerwca 2017 w C i C++ przez interderabilja Początkujący (320 p.)
0 głosów
3 odpowiedzi 831 wizyt
pytanie zadane 6 września 2015 w HTML i CSS przez Lukasz Bywalec (2,320 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...