在 class 外定义的未定义符号,在 class 内定义时有效
Undefined symbol when defined outside class, works when defined inside class
我是 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) {};
};
在上述情况下,链接器失败并显示:
Undefined symbol base::base(int)
我觉得我犯了一个非常愚蠢的错误,但编译器的错误完全没有帮助。
编译器准确地告诉您问题出在哪里。如果你调用它,你必须为 base
定义一个构造函数,并且你是从派生的 class child
.
调用它
尝试将此添加到您的代码中:
base::base(const int num) {}
这会忽略给定的参数,但至少您的代码会编译。
我可能会删除 base
构造函数的声明,并且不会将任何值从 child
class 传递给它,除非它被实际使用。
在第二种情况下,构造函数是内联的并且从不调用,因此编译器不需要为其生成代码,但是如果您尝试实际构造一个 child
对象,您将获得相同的链接器错误。
未生成内联代码的原因是您没有调用调用站点。声明内联代码的全部目的是在调用站点 inlined。因此,编译器将所有内联代码的代码生成推迟到实际调用时。
当您在 class 中定义构造函数时,编译器实际上不会查找基础 class 构造函数,直到您尝试实际实例化 class 的成员。一旦你这样做了(通过例如 child a(5);
),你将得到与上面相同的错误,see here。但是,当您在 class 之外定义构造函数时,即使没有实例化,它也会尝试 link 它,即使没有 child a(5);
.
也会导致错误
我是 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) {};
};
在上述情况下,链接器失败并显示:
Undefined symbol
base::base(int)
我觉得我犯了一个非常愚蠢的错误,但编译器的错误完全没有帮助。
编译器准确地告诉您问题出在哪里。如果你调用它,你必须为 base
定义一个构造函数,并且你是从派生的 class child
.
尝试将此添加到您的代码中:
base::base(const int num) {}
这会忽略给定的参数,但至少您的代码会编译。
我可能会删除 base
构造函数的声明,并且不会将任何值从 child
class 传递给它,除非它被实际使用。
在第二种情况下,构造函数是内联的并且从不调用,因此编译器不需要为其生成代码,但是如果您尝试实际构造一个 child
对象,您将获得相同的链接器错误。
未生成内联代码的原因是您没有调用调用站点。声明内联代码的全部目的是在调用站点 inlined。因此,编译器将所有内联代码的代码生成推迟到实际调用时。
当您在 class 中定义构造函数时,编译器实际上不会查找基础 class 构造函数,直到您尝试实际实例化 class 的成员。一旦你这样做了(通过例如 child a(5);
),你将得到与上面相同的错误,see here。但是,当您在 class 之外定义构造函数时,即使没有实例化,它也会尝试 link 它,即使没有 child a(5);
.