【问题标题】:Undefined reference to, problem with inheritance - C++ [duplicate]未定义的引用,继承问题 - C++ [重复]
【发布时间】:2020-09-13 21:03:34
【问题描述】:

我同时遇到以下两个错误:“未定义对 `Vessel::Vessel()' 的引用”和:“Id 返回 1 个退出状态”但没有显示。我如何解决它?我尝试了所有方法,但无法提出解决方案。

可以看出问题在于合并类或引用,但我无法弄清楚究竟是什么

下面是整个程序的代码:

#include<iostream>
#include<string>
using namespace std;

class Vessel{

 protected:

   string registration; 

   int power;

 public:

   Vessel();

   Vessel(string r, int power){
    r=registration;
    power=power;
   };
    
    string set_registration(string put){
        registration=put;
    }
    
   string get_registration(){
    return registration;
   }
    double set_power(double set){
        power=set;
    }
   double get_power(){
        return power;
   }

   virtual void print()=0;

};

class Speedboat : public Vessel{
    private:
        int speed;
    public:
        set_speed(int s){
            speed=s;
        }
        get_speed(){
            return speed;
        }
        void print(){
            cout<<get_registration()<<" "<<get_power()<<" "<<get_speed();
        }
};
class Ferry : public Vessel{
    private:
        int capacity;
};
int main(){
    Vessel * ptr;
    Speedboat obj1;
    ptr=&obj1;
    obj1.set_power(5.2);
    obj1.set_registration("ZG5212");
    ptr->print();
}

【问题讨论】:

    标签: c++ class oop inheritance


    【解决方案1】:

    问题出在这里:

    class Vessel{
    
    ...   
    
     public:
    
       Vessel();
    

    您需要为默认 ctor 提供定义,例如 Vessel() = default;

    注意,您有一个未使用的 Vessel 参数化 ctor,至少在您的代码 sn-p 中没有。你的意思是让那个在那里吗?如果是这样,您是否打算以某种方式使用它?代码的编写方式,你可以删除它。

    【讨论】:

      【解决方案2】:

      你还没有实现Vessel:: Vessel(),只是声明了它。一种可能的实现是将默认构造函数委托给实际初始化成员变量的构造函数:

      Vessel() : Vessel("", 0.0) {}   // delegates to the below
      
      Vessel(string r, int p) : registration(std::move(r)), power(p) {}
      

      这样,您可以访问默认构造的 Vessel 的值,而不会导致未定义的行为,如果您使用默认实现:Vessel() = default;

      还有:

      • set_speed()get_speed() 必须有一个类型(或声明为 void)。
      • set_registration() 被声明为返回 string 但不返回任何内容。
      • set_power() 被声明返回 double 但不返回任何内容。

      似乎 setter 函数应该返回旧值。为此,您可以使用 &lt;utility&gt; 标头中的 std::exchange 函数。示例:

      double set_power(double set){
          return std::exchange(power, set); // return the old power and set the new
      }
      

      【讨论】:

      • 具体如何实现?
      • @JanTuđan 看来你是从其他答案中想出来的?
      • 是的,我做到了,在我的编码方式中,构造函数应该是默认的,但这个答案也很有帮助。
      • @JanTuđan 太好了。我对答案也做了一些补充。
      • 我很想尝试 c++11 版本并将其与这个版本(我现在正在使用)进行比较。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 2012-03-13
      • 2014-12-06
      • 2011-09-17
      • 1970-01-01
      相关资源
      最近更新 更多