我试图通过派生类的基类访问派生类的数据成员,但遇到了一些麻烦。
代码如下:
for (auto actor : drawables) {
if (actor.isDrawable()) {
std::vector<glm::vec3> verts = actor.getVerticies();
for (glm::vec3 v : verts) {
// do stuff
}
}
}
但是当我尝试运行它时,它说当我知道我已经将 vec3 添加到 vector 中时 verts 的大小为 0。
我有一个名为 Actor3D 的基类,它具有以下属性:
class Actor3D
{
private:
static int actorCount;
protected:
int id;
bool _isDrawable;
glm::vec3 position;
glm::vec3 rotation;
std::vector<glm::vec3> verts;
//std::vector<glm::vec3> color;
std::vector<glm::vec3> normals;
virtual void addVert(float x, float y, float z);
public:
virtual std::vector<glm::vec3> getVerticies() const { return verts; }
...
}
然后我有一个具有以下定义的派生类:
#include "engine\Actor3D.h"
class Cube : public Actor3D
{
public:
Cube();
~Cube();
};
在cpp文件中:
Cube::Cube()
{
_isDrawable = true;
position.x = 5;
position.y = 5;
position.z = 7;
addVert(-1.0, 0.0, -1.0);
addVert(-1.0, 0.0, 1.0);
addVert(1.0, 0.0, 1.0);
addVert(1.0, 0.0, -1.0);
}
Cube::~Cube()
{
}
有什么方法可以通过 for 循环中的基类访问 verts vector 吗?
最佳答案
代码似乎是正确的,但您没有告诉您如何填充 drawables
和 addVert
的正文.如果您能提供一个我们可以编译和运行的小示例,那就更好了。这个用例应该不难。
请注意,您不需要将这些方法定义为虚拟方法,除非您在派生类中修改它们的行为,但这些方法不应该是这种情况。
还有 getVerticies()
(应该是 getVertices()
)返回您的 vector 的拷贝,它可能不是预期的。
当你写 for (auto actor : drawables)
您正在复制 Actor 及其所有内容,这可能不是您的意思,我会写 for (auto const &actor : drawables)
你也知道切片吗?如果你的drawables
声明为 std::vector<Actor3d>
它只包含基类而不包含派生类!
现在,如果您创建一个多维数据集并将其添加到 drawables
,您的代码应该可以正常工作。 ,因为您的示例未使用任何特定于 Cube
的内容.
同样,如果您提供一个可重现的小案例,那将更容易。带有指向 http://ideone.com/sphere-engine 的链接这将是完美的:)
关于c++ - C++ 中的多态问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23277105/