c++ - 调用一个类的构造函数,被多个类继承

标签 c++ oop inheritance parameter-passing

开门见山: 我有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);
}

我也有第三节课。这个继承了前两个。

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 的哪个概念?为什么会出现此错误?

最佳答案

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

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 继承的方向。在这种情况下你可能想要成员变量(一个人一个方向,但是一个人一个方向是不正确的)。这被称为使用组合而不是继承,如果你能摆脱它通常是最好的。作为指南,除非需要虚函数,否则通常不应使用继承。编译错误的原因是您只初始化了这两个方向之一(以及两个位置之一)。

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

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

关于c++ - 调用一个类的构造函数,被多个类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40403811/

相关文章:

c++ - Bison and doesn't name 类型错误

如果在头文件中定义映射,则需要 C++ include 语句

php - 从 javascript OOP 背景理解 php 类结构(如何调整代码工作流程)

javascript - 在类 deceleration 之外声明的方法无法被 javascript 中的子类继承

c++ - cgo : iostream:38:28: fatal error: bits/c++config. h 编译错误:没有那个文件或目录

C++——这个语句是什么意思?

c# - 覆盖基类的实现,使得从继承的基类函数调用也调用被覆盖的函数

java - 为什么我的继承申请不起作用?

java - 使用带有函数式接口(interface)的扩展 - Function<?扩展父级,*> 与 Function<? super 父级,*> 与函数<父级,*>

c++ - catch(...) 实际上捕获所有异常吗?