Ĺadny brzuch
Trochę zawile to brzmi, dam więc przykład:
class glowna; class skladnik { public: void funkcja(); }; class glowna { skladnik skladniczek; int cos; }; void skladnik::funkcja() { glowna.cos = 1; // jak? }
Z góry dziękuję za pomoc!
Użytkownik Grzese edytował ten post 27 czerwiec 2008, 18:23
Musisz najpierw utworzyć obiekt danej klasy.
obiekt = new glowna. obiekt.cos=111;
void skladnik::funkcja(glowna obiekt) { obiekt.cos = 1; }
ale oczywiście "cos" powinno być albo publiczne, bo domyślnie jest prywatna, albo klasa "składnik" powinna być zaprzyjaźniona z klasą "glowna"
u mnie w programie było... przepraszam, zapomniałem dopisać... ale to nie rozwiązuje sprawy. Cały czas dostaję komentarz kompilatora:
"expected primary-expression before '.' token"
Użytkownik Grzese edytował ten post 27 czerwiec 2008, 19:40
void skladnik::funkcja() { glowna.cos = 1; // jak? }
'glowna' to w tym przypadku nazwa nowego typu, który poprzednio utworzyłeś, nie powinieneś się do niego odwoływać w ten sposób, chyba, że użyjesz zmiennej statycznej, o tak:
class s { public: static int cos; }; int s::cos = 0; int main() { s::cos = 2; }
możesz jeszcze sprobować czegoś takiego:
class glowna; class skladnik { private: glowna parent; public: skladnik(glowna parent1); void funkcja(); }; skladnik::fskladnik(glowna parent1) //konstruktor { parent=parent1; } class glowna { skladnik skladniczek; int cos; }; glowna::glowna() //konstruktor { skladniczek = new skladnik(this); } void skladnik::funkcja() { parent.cos = 1; }
nie jestem tylko pewien czy parent i parent1 nie powinny być wskaźnikami
Tego typu zależność między klasami można bez problemu podciągnąć pod błąd projektowy. Wymaga to bowiem bardzo silnego połączenia dwóch klas, a odnoszę wrażenie, że nie jest Ci to potrzebne. Takich konstrukcji powinno się unikać, chociaż są możliwe do zrealizowania:#include <iostream> class Skladnik; class Glowna { private: int m_wartosc; Skladnik* m_skladnik; public: Glowna(); void SetSkladnik(Skladnik* s); int GetWartosc() const { return m_wartosc; } friend class Skladnik; }; class Skladnik { private: Glowna& m_glowna; public: Skladnik(Glowna& parent); void Funkcja(); }; Glowna::Glowna(): m_wartosc(1), m_skladnik(NULL) {} void Glowna::SetSkladnik(Skladnik* s) { m_skladnik=s; } Skladnik::Skladnik(Glowna& g): m_glowna(g) { } void Skladnik::Funkcja() { m_glowna.m_wartosc = 4; } int main() { Glowna glowna; Skladnik skladnik(glowna); glowna.SetSkladnik(&skladnik); std::cout << glowna.GetWartosc() << std::endl; skladnik.Funkcja(); std::cout << glowna.GetWartosc() << std::endl; return 0; }
PS. może odpowiedzią na Twój problem będzie wzorzec Dekorator?
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
class glowna; class skladnik { public: void funkcja(); }; class glowna { skladnik skladniczek; int cos; }; void skladnik::funkcja() { glowna.cos = 1; // jak? }
Z góry dziękuję za pomoc!
Użytkownik Grzese edytował ten post 27 czerwiec 2008, 18:23
Musisz najpierw utworzyć obiekt danej klasy.
obiekt = new glowna. obiekt.cos=111;
void skladnik::funkcja(glowna obiekt) { obiekt.cos = 1; }
ale oczywiście "cos" powinno być albo publiczne, bo domyślnie jest prywatna, albo klasa "składnik" powinna być zaprzyjaźniona z klasą "glowna"
u mnie w programie było... przepraszam, zapomniałem dopisać... ale to nie rozwiązuje sprawy. Cały czas dostaję komentarz kompilatora:
"expected primary-expression before '.' token"
Użytkownik Grzese edytował ten post 27 czerwiec 2008, 19:40
void skladnik::funkcja() { glowna.cos = 1; // jak? }
'glowna' to w tym przypadku nazwa nowego typu, który poprzednio utworzyłeś, nie powinieneś się do niego odwoływać w ten sposób, chyba, że użyjesz zmiennej statycznej, o tak:
class s { public: static int cos; }; int s::cos = 0; int main() { s::cos = 2; }
możesz jeszcze sprobować czegoś takiego:
class glowna; class skladnik { private: glowna parent; public: skladnik(glowna parent1); void funkcja(); }; skladnik::fskladnik(glowna parent1) //konstruktor { parent=parent1; } class glowna { skladnik skladniczek; int cos; }; glowna::glowna() //konstruktor { skladniczek = new skladnik(this); } void skladnik::funkcja() { parent.cos = 1; }
nie jestem tylko pewien czy parent i parent1 nie powinny być wskaźnikami
Tego typu zależność między klasami można bez problemu podciągnąć pod błąd projektowy. Wymaga to bowiem bardzo silnego połączenia dwóch klas, a odnoszę wrażenie, że nie jest Ci to potrzebne. Takich konstrukcji powinno się unikać, chociaż są możliwe do zrealizowania:#include <iostream> class Skladnik; class Glowna { private: int m_wartosc; Skladnik* m_skladnik; public: Glowna(); void SetSkladnik(Skladnik* s); int GetWartosc() const { return m_wartosc; } friend class Skladnik; }; class Skladnik { private: Glowna& m_glowna; public: Skladnik(Glowna& parent); void Funkcja(); }; Glowna::Glowna(): m_wartosc(1), m_skladnik(NULL) {} void Glowna::SetSkladnik(Skladnik* s) { m_skladnik=s; } Skladnik::Skladnik(Glowna& g): m_glowna(g) { } void Skladnik::Funkcja() { m_glowna.m_wartosc = 4; } int main() { Glowna glowna; Skladnik skladnik(glowna); glowna.SetSkladnik(&skladnik); std::cout << glowna.GetWartosc() << std::endl; skladnik.Funkcja(); std::cout << glowna.GetWartosc() << std::endl; return 0; }
PS. może odpowiedzią na Twój problem będzie wzorzec Dekorator?