Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

c++ prosta klasa nie kompiluje się


Rekomendowane odpowiedzi

Opublikowano

Witajcie, zaczynam dopiero programowanie. Od dwóch dni siedzę nad zadaniem i nie kompiluje się. Mają być dwie klasy, ze składnikami protected i publicznymi funkcjami, które potem ładnie wyświetlają obraz na ekranie. Mnie tymczasem w 4 ostatnich liniach maina pojawia się coś takiego: expected unqualified-id before "." token

 

#include <cstdlib>

#include <iostream>

#include <stdio.h>

#include <string.h>

using namespace std;

 

class mother {

protected:

char imie [];

int wzrost;

int waga;

char kolor_oczu;

mother () {imie,wzrost,waga,kolor_oczu;}

public:

void zapamietaj ();

void wyswietl (){ cout<<"podaj imie mamy"<<imie<< "podaj wzrost mamy"<<wzrost<< "podaj wage mamy"<<waga<< "podaj kolor oczu mamy"<<kolor_oczu<<endl;}

};

 

 

class father {

protected:

char imie [];

int wzrost;

int waga;

char kolor_oczu;

father () {imie,wzrost,waga,kolor_oczu;}

public:

void zapamietaj ();

void wyswietl (){ cout<<"podaj imie taty"<<imie<< "podaj wzrost taty"<<wzrost<< "podaj wage taty"<<waga<< "podaj kolor oczu taty"<<kolor_oczu<<endl;}

};

 

int main(int argc, char** argv) {

char imie [20];

int wzrost;

int waga;

char kolor_oczu;

cout<<"podaj imie mamy"; cin>>imie;

cout<<"podaj wzrost mamy"; cin>>wzrost;

cout<<"podaj wage mamy"; cin>>waga;

cout<<"podaj kolor_oczu mamy"; cin>>kolor_oczu;

 

cout<<"podaj imie taty"; cin>>imie;

cout<<"podaj wzrost taty"; cin>>wzrost;

cout<<"podaj wage taty"; cin>>waga;

cout<<"podaj kolor_oczu taty"; cin>>kolor_oczu;

 

 

mother.zapamietaj ("irena", 20, 20, "czarne");

mother.wyswietl ();

father.zapamietaj ("wieslaw", 60 342, "brazowe");

father.wyswietl ();

}

Opublikowano

Musisz poczytać więcej o klasach i ich instancjach.

 

Poprawiłem Twój program. Kompilowałem Visual Express C++ 2010:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

class Rodzic
{
private: //jesli nie myslisz na razie o dziedziczeniu zostaw "private" zamiast "protected "
   char imie[256]; //statyczne tablice musza miec jakis rozmiar
   int wzrost;
   int waga;
   char kolor_oczu[256]; //statyczne tablice musza miec jakis rozmiar
   bool czy_tata;
public:
   void zapamietaj (char *imie, char *kolor_oczu, int wzrost, int waga)
   {
memcpy(this->imie, imie, strlen(imie)+1); //kopiujemy
memcpy(this->kolor_oczu, kolor_oczu, strlen(kolor_oczu)+1); //kopiujemy
this->wzrost = wzrost;
this->waga = waga;
   }
   void wyswietl()
   {
if (this->czy_tata)
 cout << endl << "Tata:" << endl;
else
 cout << endl << "Mama:" << endl;
cout << "Imie - " << this->imie << endl;
cout << "Wzrost - " << this->wzrost << endl;
cout << "Waga - " << this->waga << endl;
cout << "Kolor oczu - " << this->kolor_oczu << endl << endl;
   }
   Rodzic(bool czy_tata) //konstruktor klasy zerujemy elementy, dzieki argumentowi typu bool mozemy stworzyc mame (czy_tata=false) lub tate (czy_tata = true)
   {
this->czy_tata = czy_tata;
this->waga = 0;
this->wzrost = 0;
this->imie[0] = 0;
this->kolor_oczu[0] = 0;
   }
   ~Rodzic(){}
};
int main(int argc, char** argv) {

  Rodzic mama(false); //tworzymy obiekt typu Rodzic o nazwie mama i podajemy w argumencie false chcac stworzyc mame
  char imie[256];
  int wzrost;
  int waga;
  char kolor_oczu[256];
   cout<<"podaj imie mamy: "; cin>>imie;
   cout<<"podaj wzrost mamy: "; cin>>wzrost;
   cout<<"podaj wage mamy: "; cin>>waga;
   cout<<"podaj kolor_oczu mamy: "; cin>>kolor_oczu;

  mama.zapamietaj(imie, kolor_oczu, wzrost, waga); //zapamietujemy to co wczytalismy z klawiatury
  Rodzic tata(true); //tworzymy obiekt typu Rodzic o nazwie tata i podajemy w argumencie true chcac stworzyc tate
 cout<<"podaj imie taty: "; cin>>imie;
 cout<<"podaj wzrost taty: "; cin>>wzrost;
   cout<<"podaj wage taty: "; cin>>waga;
 cout<<"podaj kolor_oczu taty: "; cin>>kolor_oczu;
 tata.zapamietaj(imie, kolor_oczu, wzrost, waga); //zapamietujemy to co wczytalismy z klawiatury

 mama.wyswietl(); //wyswietlamy parametry mamy
 tata.wyswietl(); //wyswietlamy parametry taty

 system("pause");
 return 0;
}

 

Zauważ, że nie ma potrzeby tworzenia dwóch osobnych klas jeśli mają te same elementy i funkcje.

Opublikowano

Musisz poczytać więcej o klasach i ich instancjach.

 

Poprawiłem Twój program. Kompilowałem Visual Express C++ 2010:

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

class Rodzic
{
private: //jesli nie myslisz na razie o dziedziczeniu zostaw "private" zamiast "protected "
char imie[256]; //statyczne tablice musza miec jakis rozmiar
int wzrost;
int waga;
char kolor_oczu[256]; //statyczne tablice musza miec jakis rozmiar
bool czy_tata;
public:
void zapamietaj (char *imie, char *kolor_oczu, int wzrost, int waga)
{
memcpy(this->imie, imie, strlen(imie)+1); //kopiujemy
memcpy(this->kolor_oczu, kolor_oczu, strlen(kolor_oczu)+1); //kopiujemy
this->wzrost = wzrost;
this->waga = waga;
}
void wyswietl()
{
if (this->czy_tata)
cout << endl << "Tata:" << endl;
else
cout << endl << "Mama:" << endl;
cout << "Imie - " << this->imie << endl;
cout << "Wzrost - " << this->wzrost << endl;
cout << "Waga - " << this->waga << endl;
cout << "Kolor oczu - " << this->kolor_oczu << endl << endl;
}
Rodzic(bool czy_tata) //konstruktor klasy zerujemy elementy, dzieki argumentowi typu bool mozemy stworzyc mame (czy_tata=false) lub tate (czy_tata = true)
{
this->czy_tata = czy_tata;
this->waga = 0;
this->wzrost = 0;
this->imie[0] = 0;
this->kolor_oczu[0] = 0;
}
~Rodzic(){}
};
int main(int argc, char** argv) {

Rodzic mama(false); //tworzymy obiekt typu Rodzic o nazwie mama i podajemy w argumencie false chcac stworzyc mame
char imie[256];
int wzrost;
int waga;
char kolor_oczu[256];
cout<<"podaj imie mamy: "; cin>>imie;
cout<<"podaj wzrost mamy: "; cin>>wzrost;
cout<<"podaj wage mamy: "; cin>>waga;
cout<<"podaj kolor_oczu mamy: "; cin>>kolor_oczu;

mama.zapamietaj(imie, kolor_oczu, wzrost, waga); //zapamietujemy to co wczytalismy z klawiatury
Rodzic tata(true); //tworzymy obiekt typu Rodzic o nazwie tata i podajemy w argumencie true chcac stworzyc tate
cout<<"podaj imie taty: "; cin>>imie;
cout<<"podaj wzrost taty: "; cin>>wzrost;
cout<<"podaj wage taty: "; cin>>waga;
cout<<"podaj kolor_oczu taty: "; cin>>kolor_oczu;
tata.zapamietaj(imie, kolor_oczu, wzrost, waga); //zapamietujemy to co wczytalismy z klawiatury

mama.wyswietl(); //wyswietlamy parametry mamy
tata.wyswietl(); //wyswietlamy parametry taty

system("pause");
return 0;
}

 

Zauważ, że nie ma potrzeby tworzenia dwóch osobnych klas jeśli mają te same elementy i funkcje.

Z Twoim ostatnim zdaniem się nie zgodzę. Przykładem może być pudełko i zabawka. Jeśli chcesz włożyć zabawkę do pudełka to zabawka musi mieć wskaźnik, aby nie trafić na raz do dwóch pudełek. Nie jestem do końca pewny czy zrozumiesz, ale mam świadomość że spróbowałem. ;-)

Opublikowano

@TheStychu

Robienie klasy rodzic z

bool czy_tata;

jest trochę dziwne, nie uważasz? Nie lepiej już zapisać płeć?

 

do kopiowania stringów powinno się używać strcpy, albo przenieść się na std::string

 

BRAK KONSTRUKTORA BEZPARAMETROWEGO

 

zamiast endl powinno się używać '\n' jeśli nie ma konieczności flushownia bufora

 

Brakuje konstruktora, który przyjmuje wartości dla wszystkich składowych

 

w wyświetl powinieneś sprawdzić czy ptr != null, bo możesz napotkać nieco niemiłych problemów

 

system("pause");

 

FUJ

 

niepotrzebne tworzenie bufora na stringi przed ich wczytaniem, można podać char* do cin

 

jak piszesz w C++ to nazywaj nagłówki jak w c++ a nie jak w c

 

jeśli destruktor jest pusty, to najlepiej go nie tworzyć. Już nie mówiąc o tym, że u ciebie by się przydało, żeby coś robił.

 

@daro

Jeśli chcesz włożyć zabawkę do pudełka to zabawka musi mieć wskaźnik, aby nie trafić na raz do dwóch pudełek. Nie jestem do końca pewny czy zrozumiesz, ale mam świadomość że spróbowałem. ;-)

Albo pudełko i otoczenie posiadaja liste zabawek. Wrzucając zabawkę do pudełka przenosimy zabawkę z listy zabawek otoczenia do listy zabawek w pudełku. Nie potrzeba wskaźnika i wsyztko jest logicznie. Zależy od implementacji i potrzeb (tzn, czy chcemy wiedzieć do jakiego pudełka należy przedmiot, czy może chcemy wiedzieć jakie przedmioty należa do pudełka)

Opublikowano

@TheStychu

Robienie klasy rodzic z

bool czy_tata;

jest trochę dziwne, nie uważasz? Nie lepiej już zapisać płeć?

 

Rozważając ten problem czysto programistycznie nazwanie tej zmiennej "czy_tata" jest bardziej intuicyjne niż "plec". Musielibyśmy z góry założyć że jeśli "plec = true" to jest to mama, a jeśli "plec = false" to jest to tata lub na odwrót. Z kolei jeśli nazwaliśmy tą zmienną "czy_tata" łatwiej jest nam w tym momencie zbudować warunek, bo intuicyjnie wiemy, że jeśli czy_tata = true to jest to tata a nie mama - if (czy_tata) {kod dla taty} else {kod dla mamy}. Teraz przyjmijmy, że zmienna nazywa się plec - jeśli nie pamietamy jakie przyjęliśmy założenia początkowe, ciężko nam zbudować warunek - if(plec) ?????, jak nie ma komentarza typu "//plec = true = tata" jest jeszcze gorzej i musimy na podstawie napisanego wcześniej (powiedzmy przez kogoś innego) kodu domyślać się jak powinniśmy interpretować wartość zmiennej "plec".

 

Nazwa zmiennej "czy_tata" jest dodatkową informacją dla programisty. Wbrew pozorom przy budowaniu bardzo rozbudowanych klas/programow nazwy zmiennych są bardzo ważne i ułatwiają pisanie kodu.

 

do kopiowania stringów powinno się używać strcpy, albo przenieść się na std::string

 

Jeśli znamy długość stringa nie potrzebujemy używać "strcpy", ponieważ "memcpy" jest szybsze.

Fakt użyłem tutaj niepotrzebnie "memcpy", ponieważ w tym wypadku "strcpy" powinno być szybsze niż "memcpy i strlen".

 

BRAK KONSTRUKTORA BEZPARAMETROWEGO

Nie ma takiego wymogu.

 

zamiast endl powinno się używać '\n' jeśli nie ma konieczności flushownia bufora

Z tym się zgodze.

 

Brakuje konstruktora, który przyjmuje wartości dla wszystkich składowych

Nie ma takiego wymogu.

 

w wyświetl powinieneś sprawdzić czy ptr != null, bo możesz napotkać nieco niemiłych problemów

Akurat w wyswietl nie ma potrzeby bo kolor_oczu i imie to w przypadku tego programu tablice zadeklarowane ze stałym rozmiarem i są elementami klasy. Sprawdzenie powinno być w funkcji zapamietaj na argumentach imie i kolor_oczu. Ten program to nie official release i pozwoliłem sobie pominąć sprawdzenie null pointerow i założyć, że użytkownik czegoś takiego nie zrobi. Nawet sprawdzenie czy ptr != null nie zawsze skutkuje bo zawsze można podać zapamietaj((char*)(0x7f7f7f7f7), ...) - jeśli wiesz o co chodzi.

 

niepotrzebne tworzenie bufora na stringi przed ich wczytaniem, można podać char* do cin

 

Oczywiście, że potrzebne. Zrobienie czegoś takiego:

 

char *s;

cin >> s;

cout << s;

 

Po prostu wywali program.

 

jeśli destruktor jest pusty, to najlepiej go nie tworzyć. Już nie mówiąc o tym, że u ciebie by się przydało, żeby coś robił.

Destruktor będzie wstawiony inline i jeśli nie ma tam kodu, po prostu nic się nie zrobi, nie wywoła.

 

 

EDIT;

 

Nie zrozumiałem kwestii z system("pause") i nagłówkami, bo programowanie w C++ zdaje się nie polega tylko na używaniu cout i cin zamiast printf i scanf. Niektórzy błędnie sądzą, że użycie printf zamiast cout w C++ jest czymś niepoprawnym.

 

 

Nie mówię, że nie napisałbym tego wszystkiego lepiej, ale to miało tylko działać i pokazać jak mniej więcej powinno się używać klas. Nie pisałem tego programu na zlecenie, a tylko poprawiłem błędy kolegi i trzymałem się jego idei. Siedziałem nad tym nie więcej niż 2 minuty.

 

Pomimo wszystko dzięki za uwagi.

 

EDIT2;

 

@down@down

A tych nagłówków nie zmieniałem, zostawiłem takie jakie miał asiatalia, ja też bym dał tylko iostream.

Opublikowano
Musielibyśmy z góry założyć że jeśli "plec = true" to jest to mama, a jeśli "plec = false"

enum Sex{MALE,FEMALE};

?

i jeśli plec to raczej nie tata a męższczyzna/kobieta (male/female)

 

Jeśli znamy długość stringa nie potrzebujemy używać "strcpy", ponieważ "memcpy" jest szybsze.

wyliczenie dlugości stringa to O(n), ale szczerze powiem, że nie wiem jak to wygląda od środka i któro jest szybsze. Nie chce się z tym kłócić

 

 

 

 

 

 

BRAK KONSTRUKTORA BEZPARAMETROWEGO

Nie ma takiego wymogu.

to machnij sobie Rodzic* duzoRodzicow = new Rodzic[32];

nie zadziała, gdy jest zadeklarowany jawnie przynajmniej jeden konstuktor, a jednocześnie nie ma konstruktora bezparametrowego

 

Brakuje konstruktora, który przyjmuje wartości dla wszystkich składowych

Nie ma takiego wymogu.

Ale byłoby to wygodniejsze, nie sądzisz?

 

 

zapamietaj((char*)(0x7f7f7f7f7), ...) - jeśli wiesz o co chodzi.

jest różnica pomiędzy tym, że użytkownik wie, że podaje zły ptr, a tym, że w ukrytej przed nim implementacji znajduje się zły ptr

a co do ogólnej idei ktorą wprowadziłeś w swoim kodzie to jest dobra, nie popatrzyłem dokładnie i myślałem, że nullujesz ptr, a nie pierwszy znak ;x

 

Oczywiście, że potrzebne. Zrobienie czegoś takiego:

racja, myślałem, że cin jest mądrzejsze i samo zaalokuje pamięc ;x

 

Destruktor będzie wstawiony inline i jeśli nie ma tam kodu, po prostu nic się nie zrobi, nie wywoła.

Jeśli jest pusty to nie ma potrzeby wstawiania go. Ale jak wolisz

 

Nie zrozumiałem kwestii z system("pause")

programów konsolowych się z reguły nie zatrzymuje, bo uruchamia się je z poziomu konsoli, która się nie wyłącza automatycznie po ich zakończeniu.

 

agłówkami, bo programowanie w C++ zdaje się nie polega tylko na używaniu cout i cin zamiast printf i scanf

C:

#include <stdio.h>

C++

#include <cstdio>

 

Nie mówię, że nie napisałbym tego wszystkiego lepiej

Ja to jak najbardziej rozumiem, ale wskazanie błędów jest również dobre dla osoby, która prosi o kod, będzie miała lepsze pojęcie o tym co jest w nim źle, a co dobrze.

 

btw. tam się komuś gdzieś wkradło jestszcze

#include <string.h>

nie ma czegoś takiego, jestylko #include <string>

Opublikowano

enum Sex{MALE,FEMALE};

?

i jeśli plec to raczej nie tata a męższczyzna/kobieta (male/female)

 

 

Facepalm... Polskiego w szkole nie miałeś jeszcze?

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...