2014-12-15 3 views
0

Я хочу определить некоторые произвольные свойства для каждой точки в некоторых классах, но тип и количество свойств не определены ранее. Поэтому мне нужно сохранить их в векторе, но я не знаю, как определить вектор, чтобы каждый элемент имел не определенный размер и имел различное количество полей. Класс выглядит следующим образом:вектор с неопределенным размером элемента и количества элементов

class UnstructuredMesh 
{ 
std::vector<size_t>  m_cellBegIndices;  //!< Cell Beginning Indices 
std::vector<size_t>  m_faceBegIndices;  //!< Face Beginning Indices 
std::vector<OSG::Pnt3f> m_points;    //!< Points 
std::vector<????, ????> m_pointProperties;  //!< Point Properties 
}; 

Может ли кто-нибудь помочь мне с этой проблемой?

+1

Как об использовании, например, [Boost Any] (http://www.boost.org/doc/libs/1_57_0/doc/html/boost/any.html) или [Boost Variant] (http://www.boost.org/doc/libs /1_57_0/doc/html/variant.html)? –

+0

@JoachimPileborg По моему вопросу я имею в виду, что все векторные элементы имеют одинаковый размер, но их размеры не определены ранее, и это будет определено во время выполнения, но я думаю, что это нужно использовать для вектора, который их элементы имеют разные размеры , Не так ли? – mmostajab

+0

В этом случае невозможно использовать 'std :: vector', поскольку в момент компиляции он должен содержать указанный тип. Вы могли бы сделать это, используя 'void' *' и type-casting, но у него плохой запах кода. Кроме того, когда вы говорите, что размер исправлен, но во время выполнения он заставляет меня угадать, что у вас уже есть несколько разных структур, и вы просто выбираете один из них, когда программа работает, что означает, что вы действительно можете использовать Boost Any (или объединения), или, возможно, вы можете использовать 'std :: string' или' std :: vector '(или аналогичный) для данных. –

ответ

0

Хорошо, хорошо, учитывая комментарии, я решил, что приведу пример того, что я предложил. Трудно точно знать, что вы делаете, но это предполагает, что вы заполняете вектор с помощью каких-то исполняемых компонентов, которые должны выполнять разные вещи.

Я вижу, что вы уже решили свою проблему, но что-то вроде ниже может сделать более понятное решение. Очевидно, что освобождение памяти на векторе должно обрабатываться в какой-то лучшей форме в реальном приложении и не забывать включать виртуальный деструктор в реальную жизнь. Но это компилируется и работает.

#include "windows.h" 
#include <tchar.h> 
#include <vector> 
#include <stdio.h> 

class iface 
{ 
public: 
    virtual void execute() = 0; 

}; 

class do_stuff_A : public iface 
{ 
private: 
    int A; 
    int B; 

public: 
    do_stuff_A() 
    { 
     A = 1; 
     B = 2; 
    } 

    void execute() override 
    { 
     printf("\nA is %d, B is %d", A, B); 
    } 
}; 

class do_stuff_B : public iface 
{ 
private: 
    double A; 
    double B; 
    double C; 

public: 
    do_stuff_B() 
    { 
     A = 1.1f; 
     B = 2.2f; 
     C = 3.2f; 
    } 

    void execute() override 
    { 
     printf("\nA is %f, B is %f, C is %f", A, B); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    std::vector<iface*> my_vec; 

    my_vec.push_back(new do_stuff_A()); 
    my_vec.push_back(new do_stuff_B()); 

    my_vec[0]->execute(); 
    my_vec[1]->execute(); 

    Sleep(3000); 

    for (int i = 0; i < my_vec.size(); i++) 
    { 
     delete my_vec[i]; 
    } 

    return 0; 
} 
+0

Но тогда я должен определить класс для каждой комбинации свойств, и это невозможно в моем случае :( – mmostajab

+0

Если вы не можете создать базовый класс для всех свойств, которые вы хотите добавить к этому вектору, и сделать сами свойства классами (или я думаю). Я видел очень сложную реализацию чего-то подобного, используя шаблоны, где типы данных были определены для наследования из общего базового класса, чтобы на них можно было выполнять общие операции. Много раз я просто предпочитайте делать больше ввода, чтобы сделать дизайн более явным и менее сложным, даже если он создает менее элегантное приложение. – Ian

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

  • Нет связанных вопросов^_^