在类外部定义时,未定义的符号在类中定义时起作用

时间:2015-05-23 23:15:05

标签: c++ undefined-reference undefined-symbol

我对C ++有些新意,并试图理解语法及其行为。特别是经过大量的谷歌搜索和研究后,我无法找出为什么以下代码无法编译:

class base {
public:
    base (const int);
};

class child: base {
public:
    child (const int);
};

child::child(const int num) : base(num) {}

但这会:

class base {
public:
    base (const int);
};

class child : base {
public:
    child (const int num) : base(num) {};
};

在上述情况下,链接器失败并显示:

  

未定义的符号base::base(int)

我觉得我犯了一个非常愚蠢的错误,但编译器的错误完全没有用。

2 个答案:

答案 0 :(得分:4)

编译器正在告诉你究竟是什么问题。如果调用它,则必须为base定义一个构造函数,并从派生类child调用它。

尝试将此添加到您的代码中:

base::base(const int num) {}

这会忽略给定的参数,但至少你的代码会编译。

我可能会移除base构造函数的声明,除非实际使用,否则不会从child类传递任何值。

在第二种情况下,构造函数是内联的并且从不调用,因此编译器不需要为它生成代码,但是如果您尝试实际构造child对象,则会得到相同的链接器错误。

未生成内联代码的原因是因为您没有调用调用站点。声明代码内联的全部目的是在调用站点内联。因此,编译器会推迟所有内联代码的代码生成,直到实际调用它为止。

答案 1 :(得分:2)

在类中定义构造函数时,在尝试实际实例化类的成员之前,编译器实际上不会查找基类构造函数。完成后(例如child a(5);),您将收到与上面相同的错误see here。但是,当您在类外部定义构造函数时,它甚至在没有实例化的情况下尝试链接它,即使没有child a(5);也会导致错误。