对带有数组的构造函数的未定义引用[重复]

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 (&amp;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 来遵循先前的答案。

【讨论】:

以上是关于对带有数组的构造函数的未定义引用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

对结构方法的未定义引用[重复]

构造函数问题的未定义引用

如何在模板类之外定义构造函数[重复]

使用类标头对函数的未定义引用[重复]

堆数组中对象的构造函数[重复]

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]