Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何访问基类向量中的子类变量?(对于实体组件系统)_C++_Inheritance_Vector_Entity - Fatal编程技术网

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您必须修复对象切片错误,它才能工作。它需要是静态强制转换,而不是动态强制转换!然后它就可以工作了。@Felix
static\u cast
也可以工作。但是有点麻烦更为挑剔的是,如果您最终执行了
static\u cast
ing to
Transform
,并且您所转换的组件实际上是类似于
Render
的其他组件,那么您将调用。我喜欢动态转换的想法,但它给了我一个错误:运行时动态转换的操作数必须具有多态类type@Felix你会的我必须修复对象切片错误才能使其正常工作。它需要是静态强制转换,而不是动态强制转换!然后一切都能正常工作。@Felix
static\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();
    }
}