#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 не был предназначен ни для отладки, ни для выпуска, так что он вообще не компилировался.