2015-11-16 3 views
0

У меня есть несколько вложенных классов, которые я хочу объявить вне основного класса в отдельном файле заголовка, потому что вложенные классы очень длинные.Объявить несколько вложенных классов за пределами основного класса

Это то, что я хочу сделать:

class MainClass { 
private: 
     classA; 
     classB; 
     classC; 
     //and so on 
public: 
     method(C.var) {//code} 

Проблема заключается в том, что я получаю Error:incomplete type not allowed. потому что классы не были «определены». Есть ли что-нибудь, что я могу сделать, добавив весь код в MainClass?

Реальный код:

class Graph //fix subclass issues 
{ 
private: 
    template <class TYPE> class * linkedList; 
    template <class TYPE> class * chainingTable; 
    class * minHeap;  
    class * vertex; 
    class * edge; 

    chainingTable<vertex*> vertexList; 

    vertex * findVertex(int addrs) { return vertexList.findVertex(addrs); } 
    int weight(vertex *v, vertex *u) { return v->weight + u->weight; } 
    void relax(vertex * v, vertex * u,int i, minHeap h) 
    { 
     if(v->weight > u->weight+weight(v,u)) 
     { 
      v->weight = v->weight + weight(v,u); 
      h.decreaseKey(i, v->weight); //fixes heap 
      v->predecessor = u; 
     } 
    } 
public: 
    void addVertex(int cost, int address) 
    { vertexList.insert(new vertex(cost, address)); } //and the class continues 

Теперь с этими изменениями я получаю Error: expected either a definition or tag name

EDIT: Добавлен реальный код, который запросили, и добавил ОБНОВЛЕНО ошибка позиционирования

+0

использовать указатели или ссылки? И не ставьте код, используя эти неопределенные классы внутри файла заголовка. –

+0

Я думал, что использование ссылок будет означать, что каждый должен определить их все в конструкторе. –

+0

Включите ли вы заголовок своих дополнительных классов? – Jarod42

ответ

1

Используйте указатели на эти классы вместо ,

classA *objectA; 
classB *objectB; 
classC *objectC; 

И определите свои методы только в файле .cpp.

Чтобы понять, что происходит, когда вы определяете класс, компилятор должен знать, насколько велик объект этого класса. Если вы определяете участников, которые еще не были полностью определены, то компилятор не имеет информации о размере этих классов, и поэтому он не сможет рассчитать размер объектов этого класса.

Указатели, однако, всегда одинаковы по размеру (4 байта на 32-битных и 8 на 64-битных), и тогда можно будет вычислить размер объектов этого класса.

ps: Обратите внимание, что вы не должны определять методы в .h файлах (файлы заголовков). Заголовочные файлы должны только иметь декларации классов, а файлы .cpp имеют свои реализации.

например: Заголовок:

//--Class.h-- 
#ifndef MY_CLASS_H //include guards to make sure it only gets declared once 
#define MY_CLASS_H 

class MyClass 
{ 
    int _member; 
public: 
    MyClass(); //ctor 
    ~MyClass(); //dtor 
    int someMethod(int a, int b); 
}; 

#endif 

Конструктор с реализациями

//--MyClass.cpp-- 
#include "MyClass.h" //include your declarations 

MyClass::MyClass() 
{ 
    //constructor 
} 

MyClass::~MyClass() 
{ 
    //destructor 
} 

int MyClass::someMethod(int a, int b) 
{ 
    //code 
} 
Смежные вопросы