Dwie klasy pokazujące na siebie - jak to powinno wyglądać?

Kowallo
2013-12-09 14:43
Kowallo
0

Witam,
problem wydaje mi się prosty, ale jakoś nie mogę go obejść O_o.

Mam dwie klasy (tak na prawdę to trzy, ale mniejsza z tym :P). Każda z tych klas pokazuje na drugą (jest wskaźnik do drugiej klasy). Wygląda to mniej więcej tak:

//plikA.h
#include "plikB.h"
class klasaA
{
KlasaB* klasab;
//...
};

//plikB.h
#include "plikA.h"
class klasaB
{
klasaA* klasaa;
//...
};

No i problem jest taki, że coś jest nie tak z kompilacją... Wiem, że muszę gdzieś dodać class klasaA; lub class klasaB; przed deklaracją klasy, ale jak to zrobiłem i chciałem skorzystać z zadeklarowanego wskaźnika tj. np. klasab->jakas_funkcja(); to wywala mi błąd...

Czy może mi ktoś powiedzieć jak to powinno prawidłowo wyglądać? PLZ

Pozostało 580 znaków

2013-12-09 15:07
Moderator

Rejestracja: 13 lat temu

Ostatnio: 49 minut temu

Lokalizacja: Wrocław

2

ale jak to zrobiłem i chciałem skorzystać z zadeklarowanego wskaźnika tj. np. klasab->jakas_funkcja(); to wywala mi błąd...

Jaaaaakiiiiii, błąd? ...


Pozostało 580 znaków

2013-12-09 15:08

Rejestracja: 15 lat temu

Ostatnio: 2 minuty temu

1
//plikA.h
#pragma once
#include "plikB.h"
class KlasaB;
class klasaA
{
KlasaB* klasab;
//...
};

//plikB.h
#pragma once
#include "plikA.h"
class klasaB
{
klasaA* klasaa;
//...
};

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2013-12-09 15:15

Rejestracja: 9 lat temu

Ostatnio: 2 dni temu

0

http://ideone.com/igaCwk

prosze. Oczywiscie NIE mozesz w konstruktorze inicjowac obiektu (czyli w A nie mozesz inicjowac obiektu w B a w B inicjowac obiektu A) bo wtedy program sie zapetli. Mozesz zrobic w jedna strone czyli w A zainicjowac B ale juz nie robisz w drugiej. Lub zainicjowac w B, A, ale A zostawiasz. Mozesz takze zrobic metody

-> CreateBObject
-> CreateAObject

wywolujac to bedzesz inicjalizowal te pola.

Mozesz zrobic w konstruktorze, ale potrzebujesz zmiennej statycznej cos na zasadzie couter a konstruktor zrobic z ifem na zasadzie if (!counter) {//utrzow obiekt}

Pozostało 580 znaków

Kowallo
2013-12-09 17:08
Kowallo
0

Ok, jeśli chodzi o błędy to są one następujące:

error C2143: błąd składniowy : brakuje ";" przed "*"
error C4430: brak specyfikatora typu - założono, że int. Uwaga C++ nie obsługuje domyślnie typu int

Nawet kopiując kod @_13th_Dragon wywala mi te błędy...

Po wprowadzeniu w obu klasach deklaracji klasy przed klasą tworzoną wstępnie wyeliminowało problem. Problem pojawił się troszkę później, gdy chciałem w obu klasach wywołać funkcję z drugiej klasy.
Cały kod wygląda następująco:

//plik KlasaA.h
#pragma once
#include "KlasaB.h"
class KlasaB;

class KlasaA
    {
    public:
        KlasaA();
        ~KlasaA();
        void checkA(){}

        void check1(){
            B->checkB();
            }

    private:
        KlasaB* B;
    };

//plik KlasaB
#pragma once
#include "KlasaA.h"
class KlasaA;

class KlasaB
    {
    public:
        KlasaB();
        ~KlasaB();
        void checkB(){}
        void check2(){
            A->checkA(); //po wprowadzeniu tej klasy wywala mi errory...
            }

    private:
        KlasaA* A;
    };

Po utworzeniu takich klas mam następujące błędy:

error C2027 : wykorzystywanie niezdefiniowanego przez użytkownika typu "KlasaA"
errorC2227 : po lewej "->checkA" musi wskazywać typ class/struct/union/generic

i analogiczne błędy dla drugiej klasy

Pozostało 580 znaków

2013-12-09 17:37

Rejestracja: 15 lat temu

Ostatnio: 2 minuty temu

0
//plik KlasaA.h
#pragma once
#include "KlasaB.h"
class KlasaB;

class KlasaA
    {
    public:
        KlasaA();
        ~KlasaA();
        void checkA(){}

        void check1();
    private:
        KlasaB* B;
    };

//plik KlasaA.cpp
 #include "KlasaA.h"
void KlasaA::check1(){
            B->checkB();
            }

//plik KlasaB.h
#pragma once
#include "KlasaA.h"
class KlasaA;

class KlasaB
    {
    public:
        KlasaB();
        ~KlasaB();
        void checkB(){}
        void check2();

    private:
        KlasaA* A;
    };

//plik KlasaB.cpp
#include "KlasaB.h"
void KlasaB::check2(){
            A->checkA();
            }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon, 2013-12-09 17:37

Pozostało 580 znaków

Kowallo
2013-12-09 18:21
Kowallo
0

Dziękuję Ci bardzo @_13th_Dragon - w ten sposób rzeczywiście działa. Ale czy to oznacza, że w takim przypadku nie ma możliwości zastosowania funkcji inline?

Nie, jeśli chcesz zdefiniować je wewnątrz definicji klasy. http://ideone.com/upHRyK - kq 2013-12-09 18:34

Pozostało 580 znaków

2013-12-09 19:17

Rejestracja: 15 lat temu

Ostatnio: 2 minuty temu

0
Kowallo napisał(a):

Dziękuję Ci bardzo @_13th_Dragon - w ten sposób rzeczywiście działa. Ale czy to oznacza, że w takim przypadku nie ma możliwości zastosowania funkcji inline?

Można:

//plik KlasaA.h
#pragma once
class KlasaB;
class KlasaA
  {
   public:
   KlasaA();
   ~KlasaA();
   void checkA(){}
   void check1();
   private:
   KlasaB* B;
  };
#include "KlasaB.h"
inline void KlasaA::check1() { B->checkB(); }

//plik KlasaB.h
#pragma once
class KlasaA; 
class KlasaB
  {
   public:
   KlasaB();
   ~KlasaB();
   void checkB(){}
   void check2();
   private:
   KlasaA* A;
  };
#include "KlasaA.h"
inline void KlasaB::check2() { A->checkA(); }

tylko po kiego?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

Kowallo
2013-12-09 19:48
Kowallo
0

Rzeczywiście O_o - byłem przekonany, że inline można stosować tylko w pliku nagłówkowym...
Dziwi mnie tylko to, że kompilator wymusza umieszczenie definicji tych funkcji w pliku .cpp -> nie ma możliwości ich zdefiniowania w pliku .h...

Dzięki jeszcze raz!

O czym Ty mówisz, to wszystko wyżej jest w nagłówkach. - Endrju 2013-12-09 19:50
Definicje funkcji inline muszą być widoczne w miejscu ich zawołania, więc prawdopodobnie będziesz chciał je umieścić w pliku nagłówkowym - ale nie musisz tego robić wewnątrz definicji klasy. - kq 2013-12-09 19:51
Że co? Przecież pokazałem jak to zrobić w plikach .h - _13th_Dragon 2013-12-09 19:51

Pozostało 580 znaków

Kowallo
2013-12-09 20:06
Kowallo
0

Oraju, rzeczywiście się da ;].
Przepraszam bardzo za moją niekumatość :D
Jeszcze raz bardzo dziękuję!!!

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0