【问题标题】:Undefined reference to my derived class using 3 sub classes使用 3 个子类对我的派生类的未定义引用
【发布时间】:2021-03-13 22:39:38
【问题描述】:

我有一个默认类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";
};

我正在尝试在main() 中调用JuniorBaristaintro() 方法,但出现“未定义引用”错误。

我正在尝试这样调用我的函数:

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

【问题讨论】:

  • 在你的类中Barista(); 声明了一个构造函数,但没有定义它。也许你只是想要Barista() {}

标签: c++ derived-class


【解决方案1】:

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


另外,你有内存泄漏。您正在通过new 创建一个Barista 对象,但之后您不会“删除”它。

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!
  ...
};

【讨论】:

  • 这解决了我所有的问题。我现在注意到我在最初编写代码时犯了很多粗心的错误。感谢您全面描述我的问题并提供有用的解决方案。
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 2020-06-23
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多