C++ 如何访问基类向量中的子类变量?(对于实体组件系统)
所以我有一个带“分量”的向量。我可以很容易地从向量中访问组件变量,但是当我向向量添加子类时,我无法访问这些变量 也许这是一个非常大胆的问题,解决方案可能非常复杂,但我不知道从哪里开始,应该尝试什么,所以任何帮助都是非常感谢的C++ 如何访问基类向量中的子类变量?(对于实体组件系统),c++,inheritance,vector,entity,C++,Inheritance,Vector,Entity,所以我有一个带“分量”的向量。我可以很容易地从向量中访问组件变量,但是当我向向量添加子类时,我无法访问这些变量 也许这是一个非常大胆的问题,解决方案可能非常复杂,但我不知道从哪里开始,应该尝试什么,所以任何帮助都是非常感谢的 struct Component {}; std::vector<Component> components; struct Transform : Component { int x, y; }; void Start() { compon
struct Component {};
std::vector<Component> components;
struct Transform : Component
{
int x, y;
};
void Start()
{
components.push_back(Transform());
//can't acces x below
std::cout << components[0].x;
}
struct组件{};
std::向量分量;
结构转换:组件
{
int x,y;
};
void Start()
{
组件。推回(Transform());
//无法访问下面的x
std::cout问题是,向量存储类组件的对象。
push_back
中发生的情况是,向量创建了一个新的组件
,该组件是从Transform()
对象复制的
这里要注意的第一件大事是,你并没有真正把一个变换
对象推到向量中,因此没有这样的.x
<>注意,在C++中,只有行<代码>转换x{};< /COD>在堆栈上创建对象。因此<代码>组件y= x;< /COD>创建另一个对象并复制其数据(在该情况下,“<代码>组件> <代码>为空”)不从<代码> x<代码>。
这基本上就是代码中发生的事情,只是有点隐藏在向量中。问题是,向量存储类组件的对象。
push_back
中发生的情况是,向量创建了一个新的组件
,该组件是从Transform()
对象复制的
这里要注意的第一件大事是,你并没有真正把一个变换
对象推到向量中,因此没有这样的.x
<>注意,在C++中,只有行<代码>转换x{};< /COD>在堆栈上创建对象。因此<代码>组件y= x;< /COD>创建另一个对象并复制其数据(在该情况下,“<代码>组件> <代码>为空”)不从<代码> x<代码>。
这基本上就是代码中发生的事情,只是在向量中隐藏了一点。首先,对象切片有问题,要排序,可以执行以下操作:
struct Component {};
std::vector<std::unique_ptr<Component>> components;
struct Transform : Component
{
int x = 0, y = 0;
};
void Start()
{
components.push_back(std::make_unique<Transform>());
}
另一个选项是从组件
实现虚拟功能:
struct Component
{
virtual void Update();
};
struct Transform : public Component
{
int x = 0, y = 0;
virtual void Update() override
{
std::cout << x;
}
};
void Start()
{
components.push_back(std::make_unique<Transform>());
for(Component& component : components)
{
component.Update();
}
}
struct组件
{
虚拟空更新();
};
结构转换:公共组件
{
int x=0,y=0;
虚拟无效更新()覆盖
{
std::cout首先,您在对象切片方面有问题,要排序,您可以执行以下操作:
struct Component {};
std::vector<std::unique_ptr<Component>> components;
struct Transform : Component
{
int x = 0, y = 0;
};
void Start()
{
components.push_back(std::make_unique<Transform>());
}
另一个选项是从组件
实现虚拟功能:
struct Component
{
virtual void Update();
};
struct Transform : public Component
{
int x = 0, y = 0;
virtual void Update() override
{
std::cout << x;
}
};
void Start()
{
components.push_back(std::make_unique<Transform>());
for(Component& component : components)
{
component.Update();
}
}
struct组件
{
虚拟空更新();
};
结构转换:公共组件
{
int x=0,y=0;
虚拟无效更新()覆盖
{
std::cout对象切片发生时,您可能需要std::vector组件;
或std::variant
。谢谢您的回答!那么现在如何添加到向量中?“组件。推回(Transform());”不再工作,因为向量需要一个指针。如何添加“std::unique\ptr”对于向量?对象切片发生时,您可能需要std::vector components;
或std::variant
。谢谢您的回答!那么现在如何向向量添加?“components.push_back(Transform());”不再工作,因为向量需要一个正确的指针?如何添加“std::unique_ptr”对于向量?我喜欢动态转换的想法,但它给了我一个错误:运行时动态转换的操作数必须有一个多态类type@Felix您必须修复对象切片错误,它才能工作。它需要是静态强制转换,而不是动态强制转换!然后它就可以工作了。@Felixstatic\u cast
也可以工作。但是有点麻烦更为挑剔的是,如果您最终执行了static\u cast
ing toTransform
,并且您所转换的组件实际上是类似于Render
的其他组件,那么您将调用。我喜欢动态转换的想法,但它给了我一个错误:运行时动态转换的操作数必须具有多态类type@Felix你会的我必须修复对象切片错误才能使其正常工作。它需要是静态强制转换,而不是动态强制转换!然后一切都能正常工作。@Felixstatic\u-cast
也能正常工作。但是如果你最终将static\u-cast
ing转换为Transform
,而你强制转换的组件实际上是另一个类似于Render
for示例,然后您将调用。
struct Component
{
virtual void Update();
};
struct Transform : public Component
{
int x = 0, y = 0;
virtual void Update() override
{
std::cout << x;
}
};
void Start()
{
components.push_back(std::make_unique<Transform>());
for(Component& component : components)
{
component.Update();
}
}