2015-05-29 2 views
0

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

главный источник

#include <iostream> 
#include "d.h" 

using namespace std; 

int main() { 

double pos[2] = { 2, 3} ; 
double speed[2] = { 0, 0} ; 
double accel[2] = { 1, 0} ; 

Body human(pos, speed, accel); 
} 

заголовка класса

#ifndef D_H 
#define D_H 


class Body { 

public: 
    Body(double k[], double l[], double m[]); 
    ~Body(); 
protected: 
    double p[2] ; 
    double v[2] ; 
    double a[2] ; 
private: 

}; 

#endif // D_H 

источник класса

#include "d.h" 
#include <iostream> 

Body::Body (double k[], double l[], double m[]) 
: p(k) , 
    v(l) , 
    a(m) 
{ 
//ctor 
} 

Body::~Body(){ 
} 

Я получаю Билд сообщения:

undefined reference to 'Body::Body(double*, double*, double*)' 
undefined reference to 'Body::~Body()' 

Было бы хорошо, если бы кто-то может мне помочь. Как правильно использовать массивы в моем конструкторе? И почему та же проблема относится к моему деконструктору? Он говорит то же самое, когда я полностью удаляю деконструктор (декларация И реализация).

+2

Вы строите исходный файл, содержащий определение конструктора и деструктора как часть проекта, и связываете результат с исполняемым файлом? –

+1

Я бы второй Энди. Похоже, вы не создаете исходный файл для 'Body' –

+0

Хорошо, я не создал исходный файл. Я использую Code :: Blocks и думал, что он будет автоматически их строить, когда я скажу ему, чтобы он не закрывал заголовок. – AyJ3y

ответ

0

Возможно, вы не ссылаетесь на исходный файл класса. Вы можете сделать это, просто предоставив оба исходных файла в командной строке.

У вас есть больше проблем, чем это. Ваш конструктор принимает указатель и пытается назначить массивы. Это не сработает. Как только вы добавите исходный код класса в команду компиляции, вы должны получить ошибки.

Я бы рекомендовал использовать std::array для всех мест, где вы используете массивы. Так, например, ваше объявление класса изменится на это:

struct Body { 
    Body(std::array<double,2> const& k, std::array<double,2> const& l, std::array<double,2> const& m); 

private: 
    std::array<double,2> p; 
    std::array<double,2> v; 
    std::array<double,2> a; 
}; 

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

+0

Также возможно 'double (& k) [2]' и т. Д., Если придерживаться массивов C-стиля –

0

Вы можете написать все это в одном файле. Затем поместите его в разные файлы, как раньше, но убедитесь, что оба файла .cpp скомпилированы и связаны. Если определение класса для Body не скомпилировано и не связано, компилятор не знает, что он есть.

#include <iostream> 

//class declaration 
class Body 
{ 
    double pos[2]; 
    double speed[2]; 
    double accel[2]; 
public: 
    Body(const double p[2], const double s[2], const double a[2]); 
}; 

//class definition 
Body::Body(const double p[2], const double s[2], const double a[2]) 
{ 
    std::copy(p, p + 2, pos); 
    std::copy(s, s + 2, speed); 
    std::copy(a, a + 2, accel); 
    for (auto item : pos) 
     std::cout << item << std::endl; 
} 

int main() 
{ 
    double pos[2] = { 2, 3 }; 
    double speed[2] = { 0, 0 }; 
    double accel[2] = { 1, 0 }; 
    Body human(pos, speed, accel); 
} 

Для Полный C++ стандарта вы можете следить за предыдущий ответ с std::array или еще лучше std::vector.

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

  • Нет связанных вопросов^_^