c++ - 使用 3 个子类对我的派生类的未定义引用
问题描述
我有一个Barista
我想要作为默认值的默认类,然后我派生了Barista
s 的类型来配合它。
class Barista
{
public:
Barista();
virtual void getOrder();
virtual void intro(){cout << "";}
};
class JuniorBarista: public Barista
{
public:
JuniorBarista();
void getOrder() override;
void intro(){cout << "Hello my name is" << name_ << "What can I get you?" << endl;};
private:
string name_ = "Joe";
};
class SeniorBarista: public Barista
{
public:
SeniorBarista();
void getOrder() override;
void intro(){cout << "Hello my name is" << name_ << "What can I get you?" << endl;};
private:
string name_ = "jan";
};
class ManagerBarista: public Barista
{
public:
ManagerBarista();
void getOrder() override;
void intro(){cout << "Hello my name is" << name_ << "What can I get you?" << endl;};
private:
string name_ = "jon";
};
我正在尝试调用in的intro()
方法,但出现“未定义的引用”错误。JuniorBarista
main()
我试图这样调用我的函数:
Barista *b;
b = new Barista();
b = new JuniorBarista();
b->intro();
我不确定我到底做错了什么,并且很想解释为什么我会收到这个错误。
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Jaden\AppData\Local\Temp\ccUPD7MN.o:lab11p1.cpp:(.text+0x20): undefined reference to `Barista::Barista()'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\Jaden\AppData\Local\Temp\ccUPD7MN.o:lab11p1.cpp:(.text+0x39): undefined reference to `JuniorBarista::JuniorBarista()'
collect2.exe: error: ld returned 1 exit status
解决方案
您在类中声明非默认、非内联构造函数,但这些构造函数的实现在哪里?链接器找不到它们,因此出现“未解决”的错误。如果您不打算实际实现构造函数,请将它们声明为default
,例如:
class Barista
{
public:
Barista() = default;
...
};
class JuniorBarista: public Barista
{
public:
JuniorBarista() = default;
...
};
class SeniorBarista: public Barista
{
public:
SeniorBarista() = default;
...
};
class ManagerBarista: public Barista
{
public:
ManagerBarista() = default;
...
};
也一样getOrder()
。您的每个类都声明了非内联getOrder()
,但是实现在哪里?
此外,您还有内存泄漏。您正在通过创建Barista
对象,new
但之后不会“删除”它。
Barista *b;
b = new Barista(); // <-- here
b = new JuniorBarista();
b->intro();
您需要摆脱该声明:
Barista *b;
b = new JuniorBarista();
b->intro();
delete b
当你完成使用它时不要忘记:
Barista *b;
b = new JuniorBarista();
b->intro();
...
delete b;
请注意,当delete
通过指向基类的指针 'ing 对象时,基类需要有一个virtual
析构函数,以便正确调用所有派生析构函数,但您的代码目前缺少:
class Barista
{
public:
...
virtual ~Barista() = default; // <-- add this!
...
};
推荐阅读
- jquery - 第二个列表项应该被选中
- shiny - 部署我的 APP 不断请求 ggplot2
- javascript - 调整不同主题的文字颜色
- android - Butterknife 抛出 java.lang.IllegalStateException 因为找不到视图(现在不存在)
- kubernetes - 如何以及在何处将参数路径放置到调用 URL
- youtube - 在容器或盒子内颤动 youtube 视频
- ruby-on-rails - Rails 无法部署到 Elastic Beanstalk Gem 文件
- javascript - 在 DnD 上正确使用 z-index
- php - 使用 Laravel Voyager 管理包实现 REST API
- python - 如何在 Python Flask 中为帖子实现点赞按钮功能?