2016-04-07 2 views
1

У меня есть серия классов на C++, которые содержат указатели друг на друга по причинам подключения. Код выглядит следующим образом:Определение классов, содержащих указатели друг на друга

class Cell; 

//classes 
class Connection { 
public: 
    Cell * source; 

    virtual bool trigger() { 
     return source->trigger(); //line 16, source of the error 
    } 

    //constructors 
    //default 
    Connection() { 
     source = NULL; 
    } 

    //call 
    Connection(Cell * in) { 
     source = in; 
    } 

    //copy 
    Connection(const Connection & in) { 
     source = in.source; 
    } 
}; 

class NotConnection : Connection { 
public: 
    virtual bool trigger() override { 
     return !source->trigger(); 
    } 

    //constructors 
    //default 
    NotConnection() { 
     source = NULL; 
    } 

    //call 
    NotConnection(Cell * in) { 
     source = in; 
    } 

    //copy 
    NotConnection(const NotConnection & in) { 
     source = in.source; 
    } 
}; 


class Cell { 
public: 
    vector<Connection *> parents; 

    virtual bool trigger() = 0; 

    ~Cell() { 
     for (int i = 0; i < parents.size(); i++) { 
      delete parents[i]; 
     } 
    } 
}; 

Я думал, что я мог бы использовать вперед декларацию, чтобы прояснить любые вопросы компиляции, но когда я пытаюсь построить проект, я получаю ошибку:

source.cpp(16): error C2027: use of undefined type 'Cell' 

Я пытался ПЕРЕУСТАНОВКИ упорядочив классы и переадресовывая объявление Connection, и это тоже не сработало, поэтому мой вопрос заключается в том, почему компилятор выбрасывает эту ошибку и что я могу сделать для ее устранения?

+0

Um ... какая линия линии 16? – Brian

+0

Я добавил комментарий, чтобы показать, какая строка 16 – Stephen

ответ

1

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

Сначала вы должны сначала объявить trigger, а затем определить его после определения Cell.

class Cell; 

class Connection { 
public: 
    Cell * source;  
    virtual bool trigger(); 
}; 

class Cell { 
    // definition of Cell 
}; 

inline bool Connection::trigger() { 
    return source->trigger(); 
} 
+0

Считается ли это хорошим этиком, чтобы сначала определить все классы в качестве прототипов, а затем написать реализации после этого, чтобы избежать этой ошибки в будущем? – Stephen

0

Вы можете использовать классы, объявленные вперед, при объявлении указателей или ссылок на них, но вы не можете использовать эти типы.

Переместите connection::trigger() реализацию в .cpp файла, или определить его как inline после определения cell класса.

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