2016-11-29 12 views
0

Я работаю над упражнением в uni, и каждый раз, когда я пытаюсь скомпилировать main.cpp, я всегда получал такая же ошибка.C++ error:: -1: error: symbol (s) не найден для архитектуры x86_64 - в Qt-Creator

actor.h:

class Actor { 
public: 
Actor(); 
Actor(double x0, double y0); 
void move(); 
double pos_x(); 
double pos_y(); 

static const int ARENA_W = 500; 
static const int ARENA_H = 500; 
}; 

plane.h (подкласс актера):

class Plane:Actor 
{ 
public: 
Plane(); 
Plane(double x0, double y0); 
void move(); 
double pos_x(); 
double pos_y(); 

//int dx = 5; 
static const int W = 50; 
static const int H = 20; 

private: 
double x, y; 
}; 

plane.cpp

#include "plane.h" 
#include "actor.h" 

Plane::Plane(double x0, double y0) 
{ 
this ->x = x0; 
this ->y = y0; 
//this -> dx; 
} 

void Plane::move() 
{ 
x = x + 2.5 ; 
} 

double Plane::pos_x() 
{ 
return x; 
} 
double Plane::pos_y() 
{ 
return y; 
} 

main.cpp

include "plane.h" 
include"actor.h" 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
Plane plane1(25.0, 5.0); 
plane1.move(); 
double x = plane1.pos_x(); 
double y = plane1.pos_y(); 
cout << x << " , " << y<<endl; 
} 

Я видел, что есть много вопросов по этой проблеме, но я не исправил это. Можете ли вы мне помочь()? спасибо

+0

Пожалуйста, после точной ошибки – Starl1ght

+0

именно то, что символ (ы) не были найдены? – aschepler

+0

Возможный дубликат [Сделать ошибку: Неопределенные символы для архитектуры x86 \ _64] (http://stackoverflow.com/questions/33488801/make-error-undefined-symbols-for-architecture-x86-64) – TheDarkKnight

ответ

0

Вы объявили класс Actor в actor.h:

class Actor { 
    public: Actor(); 
}; 

Это означает, что вы собираетесь написать код, который будет определять эту конструкцию. Обычно это заканчивается в файле Actor.cpp.

Если вы попытаетесь построить Actor без этой реализации, вы получите сообщение об ошибке от компоновщика, потому что вам не нужен конструктор по умолчанию.

Теперь вы объявили Plane это подкласс из Actor:

class Plane : Actor { 
}; 

и вы определили не по умолчанию конструктор:

Plane::Plane(double, double) { 
    // does something 
} 

Как Plane подкласс Actor , существует неявное построение по умолчанию Actor как часть конструкции Plane, и, как вы заявили, что будет реализация, компоновщик является expec его. Поскольку вы никогда не определяли его в коде, компоновщик терпит неудачу на этом этапе.

Несколько упрощенное решение заключается в добавлении тривиального конструктора в actor.h; а именно:

class Actor { 
public: 
Actor() {} // replace the ; with {} 
Actor(double x0, double y0); 
void move(); 
double pos_x(); 
double pos_y(); 

static const int ARENA_W = 500; 
static const int ARENA_H = 500; 
}; 

Now, as for behaviours here - none of the move , pos_x or pos_y methods are declared virtual , so they're not being overloaded in Plane ; they're simply being replaced. This may come up later in your course.

+0

так что я должен написать файл actor.cpp ? –

+0

Если вы намерены реализовать правильные конструкторы и иметь реализации 'move' и' pos_x' и 'pos_y', то добавление файла' actor.cpp' будет подходом; однако, как я уже прокомментировал ответ; потому что код тривиален, реализации в файле .h' вполне приемлемы, как написано. – Petesh

+0

Он работает! Большое спасибо! –