2012-02-06 3 views
2

Ищете эквивалентный контейнерный класс, соответствующий классу коллекций Arrayalist C#. Есть ли что-нибудь, что близко к контейнеру, который может обеспечить индексирование на основе индекса, а также хранить несколько типов данных.C++ Эквивалент C# Arraylist для хранения нескольких типов данных

То, что я пытаюсь сделать, это реализовать Model-View-Controler. Я пытаюсь создать контроллер, который может внутренне управлять различными типами формы типов данных (например: 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++, которые могут помочь мне достичь этой функциональности или есть способ использовать векторный класс для хранения нескольких типов данных.

+1

¤ Вопрос звучит как красная селедка: DESIGN ERROR. Но, учитывая, что вы действительно этого хотите, самым простым является только тип структуры, содержащий строку int * и *. И, возможно, член, который говорит, что. Паскаль-подобное решение представляет собой «вариантную запись», что означает объединение с членом, обозначающим, какой член профсоюза в настоящее время действителен. Это работает в C++ 11, но не для типов с конструкторами в C++ 03. Вы можете использовать boost :: variant или другой класс Boost, я забыл имя. Но, учитывая, что это, скорее всего, ошибка дизайна, я советую держать его простым, быть готовым удалить его. Cheers & hth., –

+0

@Serge: пожалуйста, также объясните OP как способ доступа к этим элементам. Cheers, –

+0

Следуя за комментарием Альфа. Если используется Visual Studio, ваша «вариантная запись» буквально VARIANT :-) –

ответ

3

Вы можете что-то вроде этого:

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 
} 
+0

Я пытаюсь создать интерфейс для внутреннего управления различными типами данных формы, шаблоном проектирования Model-View-Controller. Я работаю над контроллером, который будет хранить внутри себя различные типы форм, но предоставлять клиенту перегруженные методы добавления/удаления/редактирования. Например, клиентский код: 'Controller cc; cc.CreateShape (новый Box3D()); cc.CreateShape (новый Circle3D()); 'etc ... ' – badboy11

+2

Если у вас уже есть какая-то иерархия, то то, что у меня есть, обычно является довольно хорошим решением. Храните вокруг вектора указателей формы, которые виртуальные методы могут вызывать конкретные реализации в ваших классах. – Collin

+0

Иерархия хороша, и я пошел бы по этому пути, но у меня есть 2d и 3d фигуры, поэтому я застрял с родительскими классами Shape2D и Shape3D. Еще нужно как-то управлять двумя типами данных внутри. Моим последним вариантом было бы создать 2 вектора 'vector vec1;' и 'vector vec1;' – badboy11

0

Единственный путь ваш будет поставить более одного типа данных в вектор является инкапсулировать.

Смежные вопросы