直截了当: 我有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编译器错误:成员函数或costructor初始化列表中的嵌套类 错误3错误C2535:'void FRW :: gameObj :: __ dflt_ctor_closure(void)':已定义或声明成员函数。
拜托,谁能告诉我,我错过了哪个OOP概念?为什么我收到此错误?
答案 0 :(得分:3)
您需要从类继承或者将该类型的元素作为成员,而不是两者都有!即:
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;
};
(实际上,你可能想要最后一个,但在实践中非常罕见。)对于最后一个,你最终会在{{1}中找到两个方向} {} gameObj
成员,以及gameObj继承的方向。在这种情况下,你可能想要一个成员变量(一个人有一个方向,但是一个人 一个方向并不是真的。)这是用来调用的组成而不是继承,如果你能逃脱它通常是最好的。作为指南,除非您需要虚函数,否则通常不应该使用继承。编译错误的原因是您只是初始化这两个方向中的一个(以及两个位置中的一个)。
顺便说一句,错误会被构造函数的默认值隐藏。但是它们需要在标题中而不是.cpp(否则只有.cpp中的代码才能定义&#34;知道&#34;关于默认值)。
修改:此外,代码gameObj::objDir
应为FRW::Direction::Direction(dirX, dirY)
。这是编译错误的真正原因(但是一旦你修复了它,我认为你会得到我上面提到的错误。)