2016-05-30 1 views
0

Итак, у меня есть 2 класса, назовем их классами A и B, которые внутри этих классов имеют ссылку друг на друга как аргумент функции. Когда я пытаюсь передать объявить это следующим образом:Вперед объявить классы, переопределение классов

// A.h (Header guarded) 
namespace ns { 
    class B { // Attempt to forward declare B 
    public: 
     int getRand(); 
    }; 

    class A { 
    public: 
     float a, b; 

     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A { // Attempt to forward declare A 
    public: 
     float a, b; 
    }; 

    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

Дело в том, когда я делаю это я получил 'class' type redefinition ошибку. Я искал решение и до сих пор не пришел к решению. Правильно ли я это делаю? Который я предполагаю, что я не, вы можете сказать мне, где я сделал неправильный здесь?

+2

Это не передовая декларация, которую вы получили там! «класс B» будет. – jrok

+0

@jrok hmm, но что, если мне нужно получить доступ к переменным B от A? Без него он будет генерировать ошибку, которая является «неполным типом не разрешена» – Greffin28

+0

Это зависит от классов. Расскажите нам больше о них и чего вы хотите достичь. – jrok

ответ

2

Это не форвардная декларация, они определенно определены.

Вы должны

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 

    class A { 
    public: 
     // Some functions with B references as arguments   
    }; 
} 

И это же для B.h.

В соответствии с вашей ситуацией, есть только некоторые функции-члены, которые принимают объявленный класс как параметры, вы можете оставить объявление функций-членов в файле .h и предоставить их определение в .cpp-файле. Такие, как

// A.h (Header guarded) 
namespace ns { 
    class B; // forward declare B 
    class A { 
    public: 
     float a, b; 
     void aFunc(B &b);  
    }; 
} 

// B.h (Header guarded) 
namespace ns { 
    class A; // forward declare A 
    class B { 
    public: 
     void bFunc(A &a); 
     int getRand(); 
    }; 
} 

// A.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void A::aFunc(B& b) { /* ... */ } 
} 

// B.cpp 
#include "A.h" 
#include "B.h" 
namespace ns { 
    void B::bFunc(A& b) { /* ... */ } 
    int B::getRand() { /* ... */ } 
} 
+0

Wwhat, если мне нужно получить доступ к переменным B от A? Без этого он будет генерировать ошибку, которая является «неполным типом не разрешена». – Greffin28

+0

@ Greffin28 - Пожалуйста, заново ознакомьтесь с объектно-ориентированным дизайном и инкапсуляцией –

+0

@ Greffin28 Если есть только некоторые функции-члены, которые принимают объявленный класс в качестве параметров, вы можете просто оставить объявление функций-членов в файле .h и предоставить их определение в файле .cpp. – songyuanyao

Смежные вопросы