Klasy w oddzielnym plikach [C++]
Ostatnio zmodyfikowano 2016-10-22 17:31
Fafkorn Temat założony przez niniejszego użytkownika |
Klasy w oddzielnym plikach [C++] » 2016-10-21 17:18:58 Witam mam problem, stworzyłem program składający się z 7 plików: main, 3 pliki cpp i 3 pliki nagłówkowe do nich. Main korzystający z pierwszego pliku .h i .cpp do niego działa dobrze. Problem zaczyna się, kiedy druga klasa korzysta ze zmiennych z pierwszej, wtedy wyskakuje: '... was not declared in this scope'. Po dodaniu do wszystkich plików .cpp bibliotek z pozostałymi nagłówkami problem dalej występuje. |
|
mateczek |
» 2016-10-21 17:29:23 1 pytanie czy pliki dodałeś do projektu w jakimś ide?? 2 kod poszczególnych klas jeśli nie są zbyt skomplikowane wklej na forum 3 błąd o którym piszesz sugeruje, że plik *.cpp lub *.h nie ma dołączonego nagłówka klasy z której korzysta. lub przekombinowałeś w zależnościach. Na sucho ciężko coś powiedzieć |
|
Fafkorn Temat założony przez niniejszego użytkownika |
» 2016-10-21 17:43:07 Tak, kod nie jest zbyt skomplikowany. Nie zajmowałem się jeszcze dostępem private/public, to miała być kolejna część. main.cpp #include "kierowca.h"; #include "mechanik.h"; #include "samochod.h"; #include<iostream> using namespace std;
int main() { Samochod s1( 9, false ); Samochod s2( 30, true ); Mechanik m1; Kierowca k1; cout << "Poziom paliwa: " << s1.dajPoziomPaliwa() << endl; cout << "Poziom paliwa: " << s2.dajPoziomPaliwa() << endl; cout << "Stan techniczny: " << s1.dajStanTechniczny() << endl; cout << "Stan techniczny: " << s2.dajStanTechniczny() << endl; cout << "Czy moge jechac? ... " << s1.czyMogeJechac() << endl; return 0; }
samochod.h #pragma once
class Samochod { public: int poziomPaliwa; bool stanTechniczny; int dajPoziomPaliwa(); bool dajStanTechniczny(); };
samochod.cpp #include "samochod.h" #include "kierowca.h"
Samochod::Samochod( int q, bool w ) { poziomPaliwa = q; stanTechniczny = w; }
int Samochod::dajPoziomPaliwa() { return poziomPaliwa; }
bool Samochod::dajStanTechniczny() { return stanTechniczny; }
kierowca.h #pragma once
class Kierowca { public: bool czyMogeJechac(); };
kierowca.cpp #include "kierowca.h" #include "samochod.h"
bool Kierowca::czyMogeJechac() { if( stanTechniczny == false || poziomPaliwa < 10 ) return false; else return true; }
mechanik.h #pragma once
class Mechanik { public: void napraw(); };
mechanik.cpp #include "mechanik.h" #include "samochod.h"
void Mechanik::napraw() { stanTechniczny = true; poziomPaliwa = 60; }
|
|
mateczek |
» 2016-10-21 18:15:27 problem nie leży w plikach ale w złym użyciu klas. Nie możesz to tak w jednej klasie używać sobie nazw zmiennych z innej klasy bez odwołania do konkretnego obiektu tej drugiej klasy #include "kierowca.h"; #include "mechanik.h"; #include "samochod.h"; #include<iostream> using namespace std;
int main() { samochod s1( 9, false ); kierowca k; mechanik m; if( k.czyMogeJechac( s1 ) ) cout << "zasuwaj" << endl; else cout << "popsuty" << endl; m.napraw( s1 ); if( k.czyMogeJechac( s1 ) ) cout << "zasuwaj" << endl; else cout << "popsuty" << endl; return 0; }
poniżej dam Ci nagłówki poszczególnych klas klasa kierowca: #ifndef KIEROWCA_H #define KIEROWCA_H #include<samochod.h>
class kierowca { public: kierowca(); bool czyMogeJechac( samochod & s ); };
#endif
i plik kierowca.cpp #include "kierowca.h"
kierowca::kierowca() { }
bool kierowca::czyMogeJechac( samochod & s ) { if( s.dajStanTechniczny() == false || s.dajPoziomPaliwa() < 10 ) return false; else return true; }
klasa mechanik: #ifndef MECHANIK_H #define MECHANIK_H #include <samochod.h>
class mechanik { public: mechanik(); void napraw( samochod & _samochod ); };
#endif
i plik mechanik.cpp #include "mechanik.h"
mechanik::mechanik() { }
void mechanik::napraw( samochod & _samochod ) { _samochod.stanTechniczny = true; _samochod.poziomPaliwa = 60; }
klasa samochod plik samochod.h #ifndef SAMOCHOD_H #define SAMOCHOD_H
class samochod { friend class mechanik; int poziomPaliwa; bool stanTechniczny; public: samochod( int q, bool w ); int dajPoziomPaliwa(); bool dajStanTechniczny(); };
#endif
i plik samochod.cpp #include "samochod.h"
samochod::samochod( int q, bool w ) { poziomPaliwa = q; stanTechniczny = w; }
int samochod::dajPoziomPaliwa() { return poziomPaliwa; }
bool samochod::dajStanTechniczny() { return stanTechniczny; }
|
|
Fafkorn Temat założony przez niniejszego użytkownika |
» 2016-10-22 14:52:44 Dużo zmieniłeś w moim kodzie, nie dało się tego naprawić zmieniając tylko odwołania do bibliotek? |
|
carlosmay |
» 2016-10-22 15:17:48 Dużo zmieniłeś w moim kodzie, nie dało się tego naprawić zmieniając tylko odwołania do bibliotek? |
Nic nie stoi na przeszkodzie w przerobieniu go swój sposób z uwzględnieniem Nie możesz to tak w jednej klasie używać sobie nazw zmiennych z innej klasy bez odwołania do konkretnego obiektu tej drugiej klasy |
. |
|
Fafkorn Temat założony przez niniejszego użytkownika |
» 2016-10-22 15:24:06 Ale jaka jest zasada używania zmiennych pomiędzy klasami? |
|
mateczek |
» 2016-10-22 15:26:26 wcale nie zmieniłem dużo. Zmieniłem tylko deklaracje funkcji bool czyMogeJechac();
bool czyMogeJechac( samochod & s );
i funkcje "mian()" by zaprezentować działanie wszystkich metod klasy kierowca i mechanik. Mechanikowi dałem przyjaźń z samochodem by mógł zmieniać sobie składowe prywatne. I to wszystko. Dyrektywy "#define" dodaje moje IDE przy tworzeniu nowej klasy. Zapobiega to kilkukrotnemu włączeniu do kodu tego samego nagłówka. void Mechanik::napraw() { stanTechniczny = true; poziomPaliwa = 60; }
|
|
« 1 » 2 |