powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про веторы
9 сообщений из 9, страница 1 из 1
Вопрос про веторы
    #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
Вопрос про веторы
    #33585369
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чет... я забыл уже. Вроде как в C++ надо писать virtual в потомке.
Или не надо. А хр.... его зн..
...
Рейтинг: 0 / 0
Вопрос про веторы
    #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
Вопрос про веторы
    #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
Вопрос про веторы
    #33585627
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Zmiy]
Но как я понимаю, если в функции remove() прописано тока вывод строки "удалено", то память все-таки не освобождается. Как ее в коде самой emove_all освободить?

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

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

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

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


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