2013-05-09 5 views
0

I почти решил проблемы с моим кодом с помощью пользователей stackoverflow, но теперь у вас другая проблема. Мой код теперь выглядит следующим образом:передовая декларация 'struct bb', классы

#include <iostream> 
#include <cmath> 
#include <sstream> 
using namespace std; 

class root 
{ 
public: 
    virtual ~root() {} 

    virtual root* addA(const root& a) const=0; 
    virtual root* addB(const root& b) const=0; 
}; 

class bb; 

class aa: public root 
{ 
public: 
    aa() { } 
    aa(const aa& a) { } 

    root* addA(const root& a) const 
    { 
     return new aa(); 
    } 

    root* addB(const root& b) const 
    { 
     return new bb(); 
    } 
}; 

class bb: public root 
{ 
public: 
    bb() { } 
    bb(const bb& b) { } 

    root* addA(const root& a) const 
    { 
     return new aa(); 
    } 

    root* addB(const root& b) const 
    { 
     return new bb(); 
    } 
}; 

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

Но когда я компилирую его, он дает ошибку:

/home/brain/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root* aa::addB(const root&) const’:| 
/home/brain/Desktop/Temp/Untitled2.cpp|30|error: invalid use of incomplete type ‘struct bb’| 
/home/brain/Desktop/Temp/Untitled2.cpp|15|error: forward declaration of ‘struct bb’| 
||=== Build finished: 2 errors, 0 warnings ===| 
+0

@Mat Я думаю, что проблему зависимости можно устранить, поставив определения соответствующих методов в файлы реализации. Тем не менее, дизайн все еще опасен. – juanchopanza

ответ

4

Для этого конкретного случая, вы можете переместить определение функции-членов после класса bb имеет были определены. ИЛИ предпочтительно помещать их в отдельно .cpp файл и include заголовок.

class aa: public root 
{ 
public: 
    // .... 
    root* addB(const root& b) const; 
    // Declaration only 
}; 


class bb: public root 
{ 
public: 
    // .... 
}; 

// Here. 
inline // <--- If you define it in the header. 
root* aa::addB(const root& b) const 
{ 
    return new bb(); 
} 
2

Поскольку компилятор не имеет ни малейшего представления о классе bb так он не будет в состоянии создать объект и вернуть его return bb()

Это будет работать, если вы определяете root* addB(const root& b) const вне класса, потому что при этом раз он мог бы знать размер класса bb.

+0

Пожалуйста, подтвердите приведенную ниже ссылку для получения аналогичного вопроса .. http://stackoverflow.com/q/16398416/2168706 –

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