Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Классы с изменяемым количеством переменных/членов


Автор: Trurl 11.12.2007, 13:16
Подскажите, пожалуйста, возможно ли создать в С++ такой класс, чтобы было возможно менять у него количество переменных?

Конкретно, я пытаюсь создать класс для графа, чтобы была возможность добавлять в него вершины и дуги в произвольном количестве.

С уважением.

Автор: bsa 11.12.2007, 13:19
Trurl, лучше всего, это сделать через наследование...
Но по сути, тебе никто не мешает держать внутри класса std::vector с нужным количеством переменных.

Автор: Walker 11.12.2007, 13:21
Кажется, Вы путаете понятие класса (тип) и объекта класса.
Создайте классы Вершина, Дуга, а затем создавайте объекты в каком угодно количестве и размещайте их в классе граф например в динамических коллекциях.

Автор: Trurl 11.12.2007, 13:26
Спасибо.

Подскажите, что такое "динамическая коллекция" и как её сотворить?

Автор: bsa 11.12.2007, 13:41
Цитата(Trurl @ 11.12.2007,  13:26)
Подскажите, что такое "динамическая коллекция" и как её сотворить?

Никогда не слышал такого термина. Лучше узнать у того, кто его употребил.

Автор: Alek86 11.12.2007, 13:42
"динамическая коллекция" - это список, размер которого может меняться
можно написать самому, но лучше использовать готовые

к примеру, std::vector, std::list и так далее

Добавлено через 52 секунды
bsa, думаю, это не термин а название

Автор: bsa 11.12.2007, 13:45
нашел:
http://ru.wikipedia.org/wiki/Коллекция_(программирование)

Автор: Andrey44 11.12.2007, 13:45
Цитата

The list container allows for fast insertions and deletions anywhere in the container, but you cannot randomly access an element in the container.

The vector container behaves like an array, but will automatically grow as required.



Автор: Lazin 11.12.2007, 13:56
Цитата(Trurl @  11.12.2007,  13:16 Найти цитируемый пост)
Подскажите, пожалуйста, возможно ли создать в С++ такой класс, чтобы было возможно менять у него количество переменных?

как вариант - использовать map, в качестве ключа можно использовать строку с названием переменной, в качестве значения - вариантный тип данных, например boost::variant, но добавлять придется каждому объекту класса по отдельности.

Если действительно нужно добавлять переменные и методы объектам класса, то забудь про С++, используй языки программирования высокого уровня, например Python, там есть метаклассы, рефлексия и возможность добавлять к объекту новые аттрибуты и методы.

Автор: Alek86 11.12.2007, 14:41
оффтоп

Lazin,  smile 
думаю, Trurl не совсем того уровня, чтобы последовать твоему совету (если ошибся, извиняюсь)

Автор: Lazin 11.12.2007, 15:17
где-то читал статью, там автор предлагает добавлять такой map, что-бы потом проще было-бы добавлять новые атрибуты к классу. В этом есть один плюс, если значение с каким-то ключем не используется, то оно не хранится, например если есть класс - кнопка
Код

enum 
{
 BorderColor, TextColor
};

class Button : public SomeBaseClass
{
public:
 std::map<int, Colour> colors;
 ***
 void Draw()
 { 
    Color = defaulColor;
    if ( colors.find(BorderColor)  != colors.end() )
       Color = colors[BorderColor];
    нарисовать цветом Color ....
 }
};



Автор: Earnest 11.12.2007, 19:18
Lazin, все это здорово, если атрибуты имеют один тип, а если разные? В строках хранить? или вариант использовать? Тогда лучше сразу на Бейсике писать... Опять же, как их идентифицировать? По числовому ид-ру или по строке-имени? Нет уж спасибо... Лучше пусть хранятся ненужные с дефолтовскими значениями, авось не треснет память
 smile 
Trurl, если нужен граф, посмотри в сторону boost graph library. Можно научится пользоваться BGL, а можно просто познакомиться с концепцией - чтобы понять, что нужно хотеть от графа, а не лепить горбатого. Сочинить удачный интерфейс для сложной динамической структуры, да еще без опыта - нереально.

Автор: baldina 11.12.2007, 23:12
Цитата(Trurl @ 11.12.2007,  13:16)
Подскажите, пожалуйста, возможно ли создать в С++ такой класс, чтобы было возможно менять у него количество переменных?
Конкретно, я пытаюсь создать класс для графа, чтобы была возможность добавлять в него вершины и дуги в произвольном количестве.

Trurl, при проектировании класса лучше всего начинать с интерфейса, т.е. с того, как класс будет использоваться. А уж после думать о реализации. Именно реализация определяет, какие именно члены класса понадобятся.

Например: 

"Мне нужен класс, представляющий граф"

Код

class Graph
{
};


"Он должен иметь возможность добавлять произвольное число вершин и ребер." ---> 
"Понадобится представление для вершины и ребра". ---> 
"Ребро определяет связь между двумя вершинами"

Код

class Vertex;
class VertexDescriptor; 

class Edge {
 public:
  explicit Edge (const VertexDescriptor& from, const VertexDescriptor& to);
};

class Graph {
public:
  VertexDescriptor AddVertex (const Vertex&);
  bool AddEdge (const VertexDescriptor& from, const VertexDescriptor& to); // returns false if edge already exist
};


Это не готовый интерфейс класса, это эскиз интерфейса как иллюстрация и результат размышлений. 

А вообще Earnest права, хорошие интерфейсы (да и реализацию) уже придумали (даже неоднократно), и в boost все весьма грамотно сделано.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)