对带有数组的构造函数的未定义引用[重复]
Posted
技术标签:
【中文标题】对带有数组的构造函数的未定义引用[重复]【英文标题】:Undefined Reference to Constructor with Arrays [duplicate] 【发布时间】:2015-05-29 22:51:15 【问题描述】:我在这个论坛和面向对象语言方面相对较新,所以如果这看起来有点愚蠢,请原谅我。 我只是想测试调用一个函数,特别是一个构造函数,以数组作为参数。
主要来源
#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()'
如果有人可以帮助我,那就太好了。 如何在构造函数中正确使用数组? 为什么同样的问题适用于我的解构器? 当我完全删除解构器(声明和实现)时,它也是一样的。
【问题讨论】:
您是否将包含构造函数和析构函数定义的源文件构建为项目的一部分,并将结果链接到可执行文件中? 我会支持安迪。看起来你没有为Body
构建源文件
好的,我没有构建源文件。我正在使用 Code::Blocks 并认为当我告诉它取消标题时它会自动构建它们。
【参考方案1】:
您可能没有链接到类源文件。您只需在命令行上提供这两个源文件即可。
不过,你还有比这更大的问题。您的构造函数通过指针接收并尝试分配给数组。这行不通。将类源添加到编译命令后,您应该会得到错误。
我建议在所有使用数组的地方使用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;
;
这样做,您使用初始化列表来初始化数组将正常工作。它将复制所有元素,鉴于此构造,这似乎是您想要的。
【讨论】:
也可能是double (&k)[2]
等,如果坚持C风格的数组【参考方案2】:
您可以将整个内容写在一个文件中。接下来,像以前一样将它放在不同的文件中,但要确保两个 .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
来遵循先前的答案。
【讨论】:
以上是关于对带有数组的构造函数的未定义引用[重复]的主要内容,如果未能解决你的问题,请参考以下文章