父母和孩子的向量 C++

Posted

技术标签:

【中文标题】父母和孩子的向量 C++【英文标题】:Vector of parents and childs C++ 【发布时间】:2016-08-13 14:33:32 【问题描述】:

我想制作一个包含父元素和子元素的向量。我只用一个孩子测试了我的代码,效果很好。但是当我再添加一个孩子 (Child2) 时,我发现了一个问题。 当我尝试获取px 的值时,预期输出为:5 7 11,但我得到type 变量的值(2);

Main.cpp

#include <SFML/Graphics.hpp>
#include "Helper.h"
#include <vector>
#include <iostream>
using namespace sf;

int main() 
    std::vector<Parent*> arr1;
    arr1.push_back(new Child(3, 4, 5, 6));
    arr1.push_back(new Parent(7, 8));
    arr1.push_back(new Child2(9, 10, 11, 12));

    std::cout << static_cast<Universal*>(arr1.at(0))->dx << std::endl;
    std::cout << static_cast<Universal*>(arr1.at(1))->x << std::endl;
    std::cout << static_cast<Universal*>(arr1.at(2))->px << std::endl;
    return 0;

Helper.cpp

#include "Helper.h"

Parent::Parent(int x, int y) 
    this->x = x;
    this->y = y;


Child::Child(int x, int y, int dx, int dy) : Parent(x, y) 
    this->dx = dx;
    this->dy = dy;


Child2::Child2(int x, int y, int px, int py) : Parent(x, y) 
    this->px = px;
    this->py = py;


Universal::Universal(int x, int y) : Parent(x, y) 

Helper.h

class Parent 
public:
    int x, y;
    int type = 0;

    Parent(int x, int y);
;

class Child : public Parent 
public:
    int dx, dy;
    int type = 1;

    Child(int x, int y, int dx, int dy);
;

class Child2 : public Parent 
public:
    int px, py;
    int type = 2;

    Child2(int x, int y, int px, int py);
;

class Universal : public Parent 
public:
    int dx, dy, px, py;

    Universal(int x, int y);
;

【问题讨论】:

你的static_cast&lt;Universal*&gt;有UB。 将原始指针存储在 std::vector(或任何 STL 容器)中几乎总是一个坏主意。请改用std::vector&lt;std::unique_ptr&lt;Parent&gt;&gt; @Jarod42 ,什么是 UB? 未定义的行为。 您声称ParentChild1Child2Universal,但它们不是。 【参考方案1】:

Universal 不是 Child2 的父或子。因此,static_cast 将不起作用。

Child2 具有以下类成员:

int    int    int
 px     py    type

另一方面,Universal 包含以下类成员:

int    int    int    int
 dx      dy    px     py

这就是为什么当代码读取px 时,它最终会得到type 的值。您的编译器只是将每个类成员连续放置为其类的一部分,而不考虑类成员的名称。其中一个类中的type 与另一个类中的px 一样,最终在内存中占据相同的相对位置,即偏移量,从类的开头开始。这些类包含int 类成员。 type 是其中一个类中的第三个inttype 是另一个类中的第三个int

仅仅因为两个类有一个同名的类成员,并不意味着该类成员在内存中的内部位置与其类的成员相同。

事实上,C++ 标准并没有真正给你很多保证。无论如何,不​​能保证类成员会以任何特定的顺序排列,在内存中。实际上有一些规则,但它们与这个问题的目的无关。

即使两个类都列出了它们的字段,在类声明中,以某种特定的顺序,一个人不应该最终依赖这样一个事实,即一个非常粗鲁的static_cast 最终会得到一个不同的类,其中的字段带有与其他类具有相同值的同名。

您尝试做的正确解决方案是使用virtual 类方法。

【讨论】:

谢谢!我创建了虚拟方法 getDX、DY、PX、PY、getType 并解决了我的问题。

以上是关于父母和孩子的向量 C++的主要内容,如果未能解决你的问题,请参考以下文章

破坏父母和孩子的秩序

在平行继承层次结构中通过父母关联孩子

在一个父母中分叉多个孩子

无法正确地将值从父母传递给孩子和孩子传递给父母

SASS - 它的父母和另一个父母的孩子的嵌套孩子

选中/取消选中父母和孩子