Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про веторы / 9 сообщений из 9, страница 1 из 1
06.03.2006, 20:43
    #33585354
Zmiy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
Вообщем есть у меня 3 класса, и общий предок графический объект. Классы: точка, круг, цилиндр. Написал во внешнем модуле описания классов и самого веткора:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
class GraphicObject {
      public:
      virtual void move(int x, int y) =  0 ;
      virtual void remove() =  0 ;
      virtual void draw() =  0 ;
};
...
class Shapes
{
      vector<GraphicObject*> collection;
   public:
      void all_out();
      void remove_all();
      void add_shape( GraphicObject* );   
};
void Shapes::add_shape( GraphicObject* _new ) 
{
   collection.push_back( _new );  
}
void Shapes::all_out()
{
   //for( int i=0; i<collection.size(); i++ )
   //GraphicObject[i]->draw(); 
   vector<GraphicObject*>::iterator next;
   for( next = collection.begin();
        next != collection.end(); next++ )
   {
        (*next)->draw();
   }  
         
}
void Shapes::remove_all()
{
     vector<GraphicObject*>::iterator next;
     for( next = collection.begin();
        next != collection.end(); next++ )
   {
        (*next)->remove();
   }  
}
Но при попытке создать ту же точку в программе и потом добавить ее в массив всех объектов выходит ошибка:
60 C:\Documents and Settings\alex\My Documents\c++\classes\main.cpp no matching function for call to `Shapes::add_shape(Point)'
Код: plaintext
1.
2.
Shapes sh;
...
sh.add_shape(Point(X, Y));
Не подскажите в чем я не прав? Класс point - это точка, в конструкоторе 2 входных переменных, которые являются координатами.
...
Рейтинг: 0 / 0
06.03.2006, 20:52
    #33585369
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
Чет... я забыл уже. Вроде как в C++ надо писать virtual в потомке.
Или не надо. А хр.... его зн..
...
Рейтинг: 0 / 0
06.03.2006, 20:59
    #33585376
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
Zmiy
Код: plaintext
1.
2.
3.
4.
5.
class Shapes
{
...
      void add_shape( GraphicObject* );   
};

Но при попытке создать ту же точку в программе и потом добавить ее в массив всех объектов выходит ошибка:
60 C:\Documents and Settings\alex\My Documents\c++\classes\main.cpp no matching function for call to `Shapes::add_shape(Point)'
Код: plaintext
1.
2.
3.
Shapes sh;
...
sh.add_shape(Point(X, Y));


У тебя add_shape аргументом имеет указатель на GraphicObject.
А ты пытаешься туда засунуть значение.
Скомпилируется у тебя, если напишешь так :
Код: plaintext
1.
2.
3.
4.
5.
6.
Shapes sh;
...
sh.add_shape( new Point(X, Y) );
// или Point p(X,Y); sh.add_shape( &p );

// sh.add_shape( &Point(X, Y) ); -- писать нельзя !!

Но вот будет ли это работать.... Память- то освобождать потом надо будет ...
...
Рейтинг: 0 / 0
06.03.2006, 21:19
    #33585400
Zmiy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
Ну по идее, если я память забиваю объектами то есть функция remove_all:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void Shapes::remove_all()
{
     vector<GraphicObject*>::iterator next;
     for( next = collection.begin();
        next != collection.end(); next++ )
   {
        (*next)->remove();
   }  
}
Но как я понимаю, если в функции remove() прописано тока вывод строки "удалено", то память все-таки не освобождается. Как ее в коде самой emove_all освободить? То есть либо деструктором что ли каждый грохнуть, либо есть стандартная функция, чтоб весь вектор обнулить?
...
Рейтинг: 0 / 0
07.03.2006, 01:08
    #33585627
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
[quot Zmiy]
Но как я понимаю, если в функции remove() прописано тока вывод строки "удалено", то память все-таки не освобождается. Как ее в коде самой emove_all освободить?

Как-как - взять и освободить. Я ж не знаю, как ты ее выделял.

То есть либо деструктором что ли каждый грохнуть, либо есть стандартная функция, чтоб весь вектор обнулить?

Деструктор ничего не грохает. Обнулить вектор можно, но это не удалит объекты в нем. Вообще хранить что-то выделяемое динамически в std::vector сложновато - надо всегда удалять объекты руками. Обычно хранять объекты по значению либо хранять smart-pointers на объекты.
...
Рейтинг: 0 / 0
07.03.2006, 12:37
    #33586534
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
удалять нужно оператором delete, но правильно ли он заработает в этом случае - хз.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
09.03.2006, 11:58
    #33589210
Zmiy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
спасибо, разобрался. Нужно было просто грохать сам вектор, а эелементы фиг с ним, если что поом можно деструкотором каждый.
...
Рейтинг: 0 / 0
09.03.2006, 14:26
    #33589954
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
Ага, разобрался
Как получить утечки памяти :)
...
Рейтинг: 0 / 0
09.03.2006, 15:20
    #33590151
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про веторы
Обнуление вектора и удаление обьекта, представляющего
вектор - это разные вещи ИМХО. Вам следует по смыслу
определится, что вы собираетесь собсно делать. Обычно
я, предпочитаю удерживать экзеппляр в памяти (в пуле
обьектов) до тех пор, пока не заверит работу приложение.
Как загонять обьекты в пул - отдельная тема форума.

Утечки обычно показывает среда разработки после
завершения работы приложения. Ловля этого зверя - занятие
не для слабонервных, особенно если софт работает в
мультипоточности. Поэтому здесь я поддержу точку
зрения Мастер-Зива.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про веторы / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]