开门见山: 我有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/