Не могли бы пожалуйста подсказать, при добавление элемента в вектор я создаю его с помощью команды new
void Company::makeOrder(const char* name, const float price)
{
Order* new_order = new Order(name, price);
orders_.push_back(new_order);
}
И в конце программы я хочу чтобы деструктор класса, который хранит в себе vector удалил все его элементы, и если честно не получается, может кто подскажет?
class Order;
class Company
{
public:
Company(std::string name);
virtual ~Company()
{
auto new_it = orders_.end();
for(auto it = orders_.begin(); it != new_it; it++)
{
delete OrderVector[*it];
}
}
void makeOrder(const char* name, const float price);
void removeOrdersByProductName(const char* name);
void hire(const Employee& employee);
void fire(const char* name);
void renameEmployee(const char* old_name, const char* new_name);
friend std::ostream& operator<<(std::ostream& out, const Company& company);
private:
std::string name_;
typedef std::list
typedef std::vector
std::ostream& operator<<(std::ostream& out, const Company& company);
Ответ
Данное предложение
delete OrderVector[*it];
не имеет смысла. OrderVector - это имя типа. Поэтому применять к нему оператор индексирования бессмысленно.
Все можно сделать без всякого написания вручную цикла с помощью стандартного алгоритма std::for_each и стандартного функционального объекта std::default_delete
Вот демонстрационная программа.
#include
struct Order
{
~Order() { std::cout << "Order::~Order()" << std::endl; }
};
typedef std::vector
int main()
{
OrderVector orders = { new Order(), new Order(), new Order() };
std::for_each( orders.begin(), orders.end(), std::default_delete
return 0;
}
Ее вывод на консоль
Order::~Order()
Order::~Order()
Order::~Order()
Если хотите использовать цикл вместо алгоритма, то достаточно написать
for ( auto order : orders ) delete order;
Например,
#include
struct Order
{
~Order() { std::cout << "Order::~Order()" << std::endl; }
};
typedef std::vector
int main()
{
OrderVector orders = { new Order(), new Order(), new Order() };
for ( auto order : orders ) delete order;
return 0;
}
Результат будет такой же, что и для программы, показанной выше.
Что касается вашего собственного цикла, то правильно его будет записать следующим образом:
for ( auto it = orders_.begin(); it != orders_.end(); ++it )
{
delete *it;
}
Обратите внимание, что вместо данного объявления конструктора
Company(std::string name);
будет лучше записать
Company( const std::string &name );
Также в виду того, что вы используете вектор указателей, вам следует либо запретить копирование объектов класса, как, например, в определении класса записать
Company( const Company & ) = delete;
Company & operator =( const Company & ) = delete;
Либо определить их явно.
Комментариев нет:
Отправить комментарий