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

Posted

技术标签:

【中文标题】构造函数问题的未定义引用【英文标题】:Undefined reference to constructor problem 【发布时间】:2021-11-14 17:20:05 【问题描述】:

查看下面给出的代码

#include <iostream>
using namespace std;

class Number

    int a;

public:
    Number();

    Number(int num_1) 
        a = num_1;
    

    void print_number(void)  cout << "Value of a is " << a << endl; 
;

int main()

    Number num_1(33), num_3;
    Number num_2(num_1);

    num_2.print_number();
    return 0;

在上面的代码中,我在同一个类中有 2 个构造函数,但是在编译它时,给了我错误

ccnd0o9C.o:xx.cpp:(.text+0x30): undefined reference to `Number::Number()'
collect2.exe: error: ld returned 1 exit status  

谁能解决这个问题?我仍然需要 2 个构造函数,但没有用 num_3() 替换 num_3 主函数。

【问题讨论】:

错字:将 Number(void); 更改为 Number() 【参考方案1】:

在你的类中,你已经声明了默认构造函数,但你还没有定义它。

你可以default it(C++11 起),你会很高兴的:

Number() = default;

否则:

Number() 

正如@TedLyngmo 喜欢的帖子一样,两者的行为相同,但是根据标准,该类将获得不同的含义。更多阅读: The new syntax "= default" in C++11


@Jarod42 的注释作为旁注:默认构造函数在为成员 a 提供默认值时才有意义。否则它将是未初始化的(不确定的值)和reading them will cause to UB。

【讨论】:

这是最好的方法。见reasons 注意= default;在这里是有风险的,因为a不会被初始化,所以num_3.print_number();会导致UB。 Number(int num_1 = 0) 作为替代方案可能有意义。【参考方案2】:

使用此代码

#include <iostream>

using namespace std;
class Number

    int a;

public:
    Number();
    Number(int num_1)
    
        a = num_1;
    

    void print_number(void)  cout << "Value of a is " << a << endl; 
;

int main()

    Number num_1(33), num_3;

    Number num_2(num_1);
    num_2.print_number();

    return 0;


【讨论】:

如果您解释了为什么需要此代码,您的回答会更有用。 不知道 OP 代码有什么问题的人会发现很难发现您所做的更改。答案应该更多地是解释问题和解决方案,而不是提供现成的代码。 注意(甚至= default;)在这里是有风险的,因为a不会被初始化,所以num_3.print_number();会导致UB。

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

使用 QT 时对构造函数的未定义引用 [重复]

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

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

拷贝构造函数

未定义的对构造函数c ++的引用

拷贝构造函数