我试图通过其基类访问派生类的数据成员,但我遇到了一些麻烦。
以下是代码:
for (auto actor : drawables) {
if (actor.isDrawable()) {
std::vector<glm::vec3> verts = actor.getVerticies();
for (glm::vec3 v : verts) {
// do stuff
}
}
}
但是当我尝试运行它时,它表示当我知道我已经将vec3添加到向量中时,顶点的大小为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循环中的基类访问顶点向量?
答案 0 :(得分:2)
代码似乎是正确的,但您没有告诉您如何填充drawables
和addVert
的正文。如果你能提供一个我们可以编译和运行的小例子,那会更好。这个用例应该不难。
请注意,您不需要将方法定义为虚拟方法,除非您在派生类中修改它们的行为,但不应该是这些方法的情况。
同样getVerticies()
(应为getVertices()
)会返回您的矢量副本,但可能无意。
当你写for (auto actor : drawables)
时,你正在复制演员及其所有内容,这可能不是你的意思,我会写for (auto const &actor : drawables)
你也知道切片吗?如果您的drawables
被声明为std::vector<Actor3d>
,它只包含Base类而不是派生类!
现在,如果您创建一个多维数据集并将其添加到drawables
,您的代码应该可以正常工作,因为您的示例不使用Cube
特有的任何内容。
如果你提供一个小的可重复的案例,它会更容易。通过指向http://ideone.com/sphere-engine的链接,这将是完美的:)