【问题标题】:C++ Equivalent of C# Arraylist to hold Multiple Data TypesC# Arraylist 的 C++ 等效项以保存多种数据类型
【发布时间】:2012-02-07 02:48:51
【问题描述】:

寻找与 C# 的 Arraylist 集合类匹配的等效容器类。是否有任何接近容器的东西,可以提供基于索引的枚举以及保存多种数据类型。

我想做的是实现一个模型-视图-控制器。我正在尝试创建一个控制器,它可以在内部管理不同类型的形状数据类型(例如:Box2D、Circle2D、Circle3D 等)

//Controller code
class Controller
{
    //internally track all shapes...

    void CreateShape(const Box2d &box); 
    void CreateShape(const Box3d &box);
    void CreateShape(const Circle2d &circle);

    //More Add/Edit/Remove Shape methods...

    void Reset(); //clear the container of shapes...
};

我正在尝试创建可以容纳多种数据类型的向量或不同类型的容器。例如:

//Is this line of code possible??
vector <int, string> vec;    

int i=0;
string str = "test";

//add different data-type objs into my vector mutable array
vec.push_back(i);
vec.push_back(str);

请告知,如果 C++ 中有其他容器类可以帮助我实现此功能,或者有一种方法可以使用向量类来存储多种数据类型。

【问题讨论】:

  • ¤ 这个问题听起来像一个红鲱鱼:设计错误。但是考虑到你真的想要那个,最简单的就是一个包含一个 int 一个字符串的结构类型。也许有一个成员说哪个。类似于 Pascal 的解决方案是一个“变体记录”,这意味着一个带有一个成员的联合,表示哪个联合成员当前有效。这在 C++11 中有效,但不适用于在 C++03 中具有构造函数的类型。您可以使用 boost::variant 或其他此类 Boost 类,我忘记了名称。但是,鉴于这很可能是一个设计错误,我建议保持简单,准备好删除它。干杯&hth.,
  • @Serge:还请向 OP 解释访问这些元素的一种方法。干杯,
  • 跟进 Alf 的评论。如果使用 Visual Studio,您的“变体记录”实际上就是 VARIANT :-)
  • @Alf P. Steinbach:感谢您的反馈。我也在考虑查看 Boost 库。我正在与其他几个小组合作,并试图避免使用最小化外部库的使用,然后是 STD。

标签: c++ types containers


【解决方案1】:

你可能想要这样的东西:

class Shape {
public:
    virtual void rotate(double degrees) = 0;
    virtual void scale(double newScale) = 0;
    virtual ~Shape(){}
    //etc, etc, etc...
};

class Box2d : public Shape {
public:
    virtual void rotate(double degrees) {
        //Code for rotating...
    }

    //Implement other virtual methods...
};
class Circle2d : public Shape {}; //Implement virtual methods
class Box3d : public Shape {}; //Implement virtual methods


int main() {
    vector<Shape*> items;
    items.push_back(new Box2d());
    items.push_back(new Circle2d());

    //Now doing this:
    items[i]->rotate(180.0);
    //Will call Box2d's rotate function
}

【讨论】:

  • 我正在尝试创建一个接口来内部管理不同的形状数据类型,模型-视图-控制器设计模式。我正在开发控制器,它将在内部存储不同类型的形状,但为客户端提供重载的添加/删除/编辑方法。例如客户端代码:Controller cc; cc.CreateShape(new Box3D()); cc.CreateShape(new Circle3D()); etc...'
  • 如果你已经有某种层次结构,那么我所拥有的通常是一个很好的解决方案。保留一个 Shape 指针向量,它们的虚拟方法可以调用派生类中的具体实现。
  • 层次结构很好,我会走那条路,但我有 2d 和 3d 形状,所以我坚持使用 Shape2D 和 Shape3D 父类。仍然需要以某种方式在内部管理两种数据类型。我的最后一个选择是创建 2 个向量 vector&lt;Shape2D&gt; vec1;vector&lt;Shape3D&gt; vec1;
  • @badboy11:如果他们不共享一个公共接口,他们不应该在同一个向量中。使用两个不同的向量。
  • 如果你不能合并 IBase2D 和 IBase3D,那么你应该有两个不同的容器,一个到 IBase2D 指针,一个到 IBase3D 指针。
【解决方案2】:

将多个数据类型放入向量中的唯一方法是封装它。

【讨论】:

    猜你喜欢
    • 2012-10-18
    • 2010-09-30
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多