Подтвердить что ты не робот

Undefined ссылка на конструктор классов, включая исправления файла .cpp

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

main.cpp: 20: undefined ссылка на `StaticObject:: StaticObject (Graphics *, sf:: String,
научная фантастика:: Vector2)

Эта проблема может быть "исправлена", добавив в файл .cpp include в файле main.cpp так.

...
#include "GameObjects/StaticObject.cpp"
...

Хотя это решает проблему, это кажется плохим решением и противоречит тому, что я ранее говорил. Есть ли другой способ решить эту проблему? Я использую Netbeans 7.3 с g++ для кодирования/компиляции этой программы. Ниже приведен соответствующий код.

main.cpp

...

#include <SFML/Graphics.hpp>
#include "Graphics/Graphics.hpp"
#include "GameObjects/StaticObject.hpp"

int main(int argc, char** argv) {

    //SETUP
    Graphics graphics;

    background = new StaticObject(&graphics, "Data/Images/BackgroundPlaceholder.png",  sf::Vector2f(0,0));

...

main.hpp

...

#include <SFML/Graphics.hpp>
#include "GameObjects/StaticObject.hpp"

...

// Objects
StaticObject *background;
...

StaticObject.hpp

#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"

class StaticObject{
public:
    StaticObject();
    StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position);
    StaticObject(const StaticObject& orig);
    virtual ~StaticObject();
private:
    // The sprite stores the position
    sf::Sprite *sprite;
    sf::Texture *texture;
};

StaticObject.cpp

#include "StaticObject.hpp"
#include <SFML/Graphics.hpp>
#include "../Graphics/Graphics.hpp"

StaticObject::StaticObject(){    
}

StaticObject::StaticObject(Graphics *_graphics, sf::String texture_filename, sf::Vector2f _position) {
    sprite = _graphics->AddSprite(texture_filename);
    sprite->setPosition(_position);
}

StaticObject::StaticObject(const StaticObject& orig) {
}

StaticObject::~StaticObject() {
}

Если я добавлю следующую строку в main.cpp, ошибка исчезнет.

#include "GameObject/StaticObject.cpp"

Может кто-нибудь объяснить:

  • Почему это устраняет проблему?

  • Почему .cpp не был неявно включен через включение .hpp файл?

  • Есть ли лучший способ сделать это?

4b9b3361

Ответ 1

Ошибка undefined reference указывает, что определение функции/метода (то есть конструктора здесь) не было найдено компоновщиком.

StaticObject::StaticObject(Graphics*, sf::String,    sf::Vector2<float>)

И причина, по которой добавлена ​​следующая строка:

#include "GameObject/StaticObject.cpp"

исправляет проблему, вносит ли она реализацию как часть main.cpp, тогда как ваша фактическая реализация находится в StaticObject.cpp. Это неправильный способ , чтобы устранить эту проблему.

Я не использовал Netbeans много, но должен быть возможность добавить все .cpp файлы в один проект, чтобы Netbeans позаботился о том, чтобы связать все файлы .o в один исполняемый файл.

Если StaticObject.cpp встроен в собственную библиотеку (я очень сомневаюсь, что это так), вам может потребоваться указать путь к местоположению этой библиотеки, чтобы компоновщик мог найти реализацию.

Это то, что в идеале происходит при создании вашей программы:

Compile: StaticObject.cpp -> StaticObject.o
Compile: main.cpp -> main.o
Link: StaticObject.o, main.o -> main_program

Хотя в gcc/g++ есть способы пропустить все промежуточные поколения .o файлов и напрямую сгенерировать main_program, если вы укажете все исходные файлы (и любые библиотеки) в той же командной строке.

Ответ 2

включая файл cpp, заставляет компилятор создавать этот код как часть этого файла (чего вам не следует делать), вам нужно скомпилировать файл GameObject/StaticObject.cpp как свой собственный объект и связать 2 объекты вместе.

Ответ 3

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

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

Ответ 4

Я не знаю много netbeans, но, вероятно, GameObject/StaticObject.cpp не входит в состав компиляции источников.

Поэтому, если вы включили его вручную в main.cpp, он нашел исходный код, и все в порядке.

Ответ 5

У меня была такая же проблема, но моя была потому, что я использую проект Eclipse CDT и Autotools. Поэтому мне пришлось вручную добавить новые .h и .cpp файлы в соответствующий Makefile.am, а затем выполнить проект проектa > перенастроить проект, перестроить, то есть он.