неопределенная ошибка ссылки при попытке реализовать абстрактный класс

#c #compiler-errors #linker

#c #ошибки компилятора #компоновщик

Вопрос:

У меня есть абстрактный класс, который должен быть интерфейсом:

 //hpp
#ifndef IMOVABLE_HPP_INCLUDED
#define IMOVABLE_HPP_INCLUDED

#include "StaticMovementPath.hpp"

class IMovable{
protected:
    StaticMovementPath *staticMovementPath;
public:
    IMovable();
    virtual setStaticMovementPath(StaticMovementPath *staticmovementPath) = 0;
};

#endif // IMOVABLE_HPP_INCLUDED

//cpp
#include "IMovable.hpp"

#include "StaticMovementPath.hpp"

IMovable::IMovable()
{
    staticMovementPath = new StaticMovementPath();
}



//hpp
#ifndef STATICMOVEMENTPATH_HPP_INCLUDED
#define STATICMOVEMENTPATH_HPP_INCLUDED

class StaticMovementPath{
public:
    StaticMovementPath();
};

#endif // STATICMOVEMENTPATH_HPP_INCLUDED

//cpp
#include "StaticMovementPath.hpp"

StaticMovementPath::StaticMovementPath(){
};




//hpp
#ifndef CAMERA_HPP
#define CAMERA_HPP

#include "IMovable.hpp"

class Camera: public IMovable{
public:
    Camera();
};

#endif // CAMERA_HPP

//cpp
#include "Camera.hpp"

#include "IMovable.cpp"

Camera::Camera() : IMovable(){
}
  

Компиляция этого приведет к:

 ||=== Build: Debug in mapEditor (compiler: GNU GCC Compiler) ===|
objDebugsrcCamera.o||In function `ZN8IMovableC2Ev':|
...srcIMovable.cpp|8|undefined reference to `StaticMovementPath::StaticMovementPath()'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
  

Если я не определяю конструкторы (поэтому вызываются конструкторы по умолчанию), я не получаю никакой ошибки. Однако я получаю ту же ошибку с конструкторами, которые имеют один или несколько параметров.

Как мне заставить это работать?

Я знаю, что большая часть кода кажется бессмысленной, но я сократил его настолько, насколько мог. Та же ошибка была выдана с (более) полным кодом.

Комментарии:

1. После переопределения конструктора по умолчанию в StaticMovementPath вы уверены Camera.cpp , что файл перекомпилирован?

2. Я перестроил весь проект, ошибка сохраняется.

3. Итак, вы удалили конструктор по умолчанию и предоставили конструктору параметры. Теперь, если компоновщик все еще жалуется на конструктор по умолчанию, это намек на то, что все исходные файлы не перекомпилируются. Я бы подумал, что он должен завершиться неудачей на уровне компиляции, а не на уровне компоновки, если вообще требуется конструктор по умолчанию.

4. Я имел в виду запугивание. Когда я создаю проект, я получаю ошибку.

5. Верно, ошибка компилятора или компоновщика после удаления конструктора по умолчанию?

Ответ №1:

The StaticMovementPath.cpp не был предназначен ни для отладки, ни для выпуска, так что он вообще не компилировался.