【问题标题】:Calling a constructor of a class, inherited by multiple classes调用一个类的构造函数,被多个类继承
【发布时间】:2016-11-03 14:15:41
【问题描述】:

直截了当: 我有2节课。一个存储一组信息,另一个存储不同的信息。

.h 文件

class Direction
{
private:
    std::vector<float> dir;
public:
    Direction(std::vector<float> objDir); ......};

.cpp 文件

#ifndef frw_dir_ed
#define frw_dir_ed
#include "frw_direction.h"
#endif

FRW::Direction::Direction(std::vector<float> objDir = { .0f, .0f })
{
     for (int i = 0; i < 2; i++)
        dir[i] = objDir[i];
}
    Direction(float x, float y);

另一个 .h 文件:

class Position
{
private:
    float posX;
    float posY;
public:
    Position(float x, float y);

另一个 .cpp 文件:

#ifndef frw_pos_ed
#define frw_pos_ed
#include "frw_position.h"
#endif // !frw_pos_ed


FRW::Position::Position(float x = 0, float y = 0)
{
    setPos(x, y);
}

我还有第三节课。这个继承了之前的 2 个。

class gameObj : public Position, public Direction
{
public:
    gameObj(float x, float y, std::vector<float> direction, bool renderable);

    gameObj(float posX, float posY, float dirX, float dirY, bool renderable);

    //some funcs, destructor

private:
    FRW::Position objPos;
    FRW::Direction objDir;
    bool isRendered;
};

那是一个头文件,现在是 .cpp:

FRW::gameObj::gameObj(float x = 0.5f, float y = 0.5f, std::vector<float> direction = { .0f, .0f }, bool renderable = true) 
                                        : FRW::Direction::Direction(direction), FRW::Position::Position(x,y)
{
isRendered = renderable;
}

FRW::gameObj::gameObj(float posX = 0.5f, float posY = 0.5f, float dirX = .0f, float dirY = 0.f, bool renderable = true)
                                        : FRW::Direction::Direction(dirX, dirY), FRW::Position::Position(posX, posY)
 {
isRendered = renderable;
 }

C2456 编译器错误:协构初始化器列表中的成员函数或嵌套类 错误 3 错误 C2535: 'void FRW::gameObj::__dflt_ctor_closure(void)' : 成员函数已定义或声明。

请问,谁能告诉我,我错过了 OOP 的哪个概念?为什么我会收到此错误?

【问题讨论】:

  • 在哪里你得到错误?您可以尝试创建一个Minimal, Complete, and Verifiable Example 并展示给我们吗?
  • 不知道这个错误在说什么,但是为什么gameObj既继承了其他类又将其他类存储为成员?
  • 有点离题,但您应该阅读何时使用继承。游戏对象是位置和方向吗?如果不是,那么它不应该从他们那里继承。

标签: c++ oop inheritance parameter-passing


【解决方案1】:

您要么需要从一个类继承,要么需要将该类型的元素作为成员,而不是两者兼而有之!即这个:

class gameObj
{
public:
    // ...

private:
    FRW::Position objPos;
    FRW::Direction objDir;
    bool isRendered;
};

或者这个:

class gameObj : public Position, public Direction
{
public:
    // ...

private:
    bool isRendered;
};

但不是这个:

class gameObj : public Position, public Direction
{
public:
    // ...

private:
    FRW::Position objPos;
    FRW::Direction objDir;
    bool isRendered;
};

(实际上您可能想要最后一个,但在实践中非常罕见。)使用最后一个,您最终会在gameObj 中获得两个 方向:gameObj::objDir 成员,以及 gameObj 继承的方向。在这种情况下,您可能需要成员变量(一个人一个方向,但一个人一个方向不是真的)。​​这被称为使用组合而不是继承,如果你能摆脱它,通常是最好的。作为指导,除非您需要虚函数,否则通常不应使用继承。编译错误的原因是您只初始化了这两个方向之一(以及两个位置之一)。

顺便说一句,错误会被构造函数的默认值隐藏。但它们需要在标头中而不是 .cpp 中(否则只有定义之后的 .cpp 中的代码才会“知道”默认值)。

编辑:此外,代码FRW::Direction::Direction(dirX, dirY) 应该是FRW::Direction(dirX, dirY)。这是编译错误的真正原因(但一旦你修复它,我想你会得到我上面提到的错误)。

【讨论】:

  • 天。非常感谢。
猜你喜欢
  • 2015-06-20
  • 2020-01-09
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 2018-03-31
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多