【问题标题】:C++ inheritance (overriding constructors)C++ 继承(重写构造函数)
【发布时间】:2015-03-24 08:50:06
【问题描述】:

我正在学习带有 C++ 的 OpenGL。我正在构建小行星游戏作为练习。我不太确定如何覆盖构造函数:

projectile.h

class projectile
{

protected:
    float x;
    float y;

public:

    projectile();
    projectile(float, float);

    float get_x() const;
    float get_y() const;

    void move();
};

projectile.cpp

projectile::projectile()
{
    x = 0.0f;
    y = 0.0f;
}

projectile::projectile(float X, float Y)
{
    x = X;
    y = Y;
}

float projectile::get_x() const
{
    return x;
}

float projectile::get_y() const
{
    return y;
}

void projectile::move()
{
    x += 0.5f;
    y += 0.5f;
}

小行星.h

#include "projectile.h"

class asteroid : public projectile
{
    float radius;

public:
    asteroid();
    asteroid(float X, float Y);
    float get_radius();
};

main.cpp

#include <iostream>
#include "asteroid.h"

using namespace std;

int main()
{
    asteroid a(1.0f, 2.0f);

    cout << a.get_x() << endl;
    cout << a.get_y() << endl;
}

我得到的错误:

main.cpp:(.text+0x20): undefined reference to `asteroid::asteroid(float, float)'

【问题讨论】:

  • 你在哪里定义了小行星构造函数?

标签: c++ c++11 inheritance constructor compiler-errors


【解决方案1】:

您可以使用: 语法来调用父级的构造函数:

asteroid(float X, float Y) : projectile (x ,y);

【讨论】:

    【解决方案2】:

    好的,刚刚想通了。

    我实际上没有定义小行星构造函数,因为我认为它们会继承。但我认为我必须在 asteroid.h 中执行以下操作:

    asteroid(float X, float Y) : projectile(X, Y){];
    

    【讨论】:

    • 或创建一个asteroid.cpp,然后在那里进行。我也很确定,根据您的设计,您将希望将 float r 传递给两个 asteroid ctor 来初始化您的 radius 成员。
    • 我已将其添加到我发布的答案中,只是为了使它更多 acceptable。 (顺便说一句,你自己的答案实际上可以回答你的问题,所以我upvoted它。)
    【解决方案3】:

    您需要asteroid.cpp

    即使继承自projectile,对于非默认构造函数(即asteroid(float,float)),您仍然需要定义子类构造函数。

    您还需要定义get_radius,因为它没有在您的基类中定义。

    这可能是这样的(我冒昧地将半径值传递给两个 ctor):

    #include "asteroid.h"
    
    asteroid::asteroid(float r)
        : projectile()
    {
        radius = r;
    }
    
    asteroid::asteroid(float x, float y, float r)
        : projectile(x, y)
    {
        radius = r;
    }
    
    float asteroid::get_radius()
    {
        return radius;
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 2019-01-21
      • 1970-01-01
      • 2012-11-14
      • 2017-12-05
      • 2021-06-24
      • 2017-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多