Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы с изменяемым количеством переменных/членов 
:(
    Опции темы
Trurl
Дата 11.12.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



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

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

С уважением.
PM MAIL   Вверх
bsa
Дата 11.12.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Trurl, лучше всего, это сделать через наследование...
Но по сути, тебе никто не мешает держать внутри класса std::vector с нужным количеством переменных.
PM   Вверх
Walker
Дата 11.12.2007, 13:21 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 363
Регистрация: 23.10.2006

Репутация: 1
Всего: 16



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



--------------------
"От вчерашних побед остаётся усталость, если завтрашний день не сулит ничего..."
PM MAIL   Вверх
Trurl
Дата 11.12.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 2.11.2007

Репутация: нет
Всего: нет



Спасибо.

Подскажите, что такое "динамическая коллекция" и как её сотворить?
PM MAIL   Вверх
bsa
Дата 11.12.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



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

Никогда не слышал такого термина. Лучше узнать у того, кто его употребил.
PM   Вверх
Alek86
Дата 11.12.2007, 13:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



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

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

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


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 11.12.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



PM   Вверх
Andrey44
Дата 11.12.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата

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.





--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Lazin
Дата 11.12.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



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

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

Если действительно нужно добавлять переменные и методы объектам класса, то забудь про С++, используй языки программирования высокого уровня, например Python, там есть метаклассы, рефлексия и возможность добавлять к объекту новые аттрибуты и методы.
PM MAIL Skype GTalk   Вверх
Alek86
Дата 11.12.2007, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



оффтоп

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

Это сообщение отредактировал(а) Alek86 - 11.12.2007, 14:42


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 11.12.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



где-то читал статью, там автор предлагает добавлять такой 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 ....
 }
};



PM MAIL Skype GTalk   Вверх
Earnest
Дата 11.12.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
baldina
Дата 11.12.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(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 все весьма грамотно сделано.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.