首页 > 解决方案 > 使用 3 个子类对我的派生类的未定义引用

问题描述

我有一个Barista我想要作为默认值的默认类,然后我派生了Baristas 的类型来配合它。

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()方法,但出现“未定义的引用”错误。JuniorBaristamain()

我试图这样调用我的函数:

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

标签: c++derived-class

解决方案


您在类中声明非默认、非内联构造函数,但这些构造函数的实现在哪里?链接器找不到它们,因此出现“未解决”的错误。如果您不打算实际实现构造函数,请将它们声明为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!
  ...
};

推荐阅读