2016-12-12 5 views
0

Учитывая следующие классы:Не удалось разрешить циклическую зависимость

// myClass.hpp 
class Child1; 
class Child2; 

class MyClass { 
    public: 
    virtual void doSomething (const MyClass&) const = 0; 
    virtual void doSomething (const Child1&) const = 0; 
    virtual void doSomething (const Child2&) const = 0; 
}; 

// child1.hpp 
#include "myClass.hpp" 

class Child1 : public MyClass { 
    public: 
    virtual void doSomething (const MyClass&) const override; 
    virtual void doSomething (const Child1&) const override; 
    virtual void doSomething (const Child2&) const override; 
}; 


// child2.hpp 
#include "myClass.hpp" 

class Child2 : public MyClass { 
    public: 
    virtual void doSomething (const MyClass&) const override; 
    virtual void doSomething (const Child1&) const override; 
    virtual void doSomething (const Child2&) const override; 
}; 

Компилятор дает мне ошибки:

undefined reference to 'Child1::doSomething(MyClass const&)' 

Та же ошибка печатается для других doSomething(..) функций.

Я уверен, что есть некоторая ошибка в включении файлов (я использую include guard для каждого заголовочного файла !!). Мои вопросы: где я должен включать соответствующие файлы и где мне нужно форвардное объявление?

+0

Пожалуйста, проверьте свои файлы cpp, и если они даже скомпилированы, добавьте еще один код, чтобы мы могли видеть полную картину того, что у вас есть. –

ответ

1

Ошибка говорит вам, что нет ссылки на весь метод.

Другими словами, вам необходимо определить метод в файле * .cpp или непосредственно в заголовке. См. Например, overview или это similar question. Ответы говорят вам, что это не ошибка компилятора, а ошибка компоновщика.

Редактировать: Как говорит Ханс Олссон, также может потребоваться, чтобы вам нужно было include your cpp files.

Если вы не знаете точно, как реализация будет выглядеть, но хочу знать, если вы заголовок-концепция работы вы можете реализовать их пустой

virtual void doSomething (const MyClass&) const override {} 

Или компилятор кода с GCC с флагом «-c ", который сообщает gcc enter to just do the compiling not the linking.

+0

Вы оба правы. На самом деле, это была проблема при компоновке вместо компиляции. Отныне я большой поклонник флага компилятора «-c» :) – Kapa11

+0

Но имейте в виду, что это не «eierlegende wollmilchsau» (не знаю, как это перевести) –

+0

Поскольку я немецкий, вам не нужен перевести его :) – Kapa11

1

«Неопределенная ссылка» выглядит как проблема компоновщика. Убедитесь, что у вас есть child1.cpp, включая child1.hpp и который вы компилируете и с ним; и что child1.cpp правильно определяет функцию переопределения.

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