2016-12-22 2 views
0

Я знаю, что на этот вопрос уже ответил. Но я просто хочу подтвердить, что я понимаю.Принимая адрес временного [-fpermissive]

Вот мой код фрагмента. Он исходит от this.

#include <iostream> 
using namespace std; 

class Base 
{ 
    void a() { cout << "a "; } 
    void c() { cout << "c "; } 
    void e() { cout << "e "; } 

    // 2. Steps requiring peculiar implementations are "placeholders" in base class 
    virtual void ph1() = 0; 
    virtual void ph2() = 0; 

    public: 

    // 1. Standardize the skeleton of an algorithm in a base class "template method" 
    virtual ~Base() = default; 
    void execute() 
    { 
     a(); 
     ph1(); 
     c(); 
     ph2(); 
     e(); 
    } 
}; 

class One: public Base 
{ 
    // 3. Derived classes implement placeholder methods 
    /*virtual*/ void ph1() { cout << "b "; } 
    /*virtual*/ void ph2() { cout << "d "; } 
}; 

class Two: public Base 
{ 
    /*virtual*/ void ph1() { cout << "2 "; } 
    /*virtual*/ void ph2() { cout << "4 "; } 
}; 

int main() 
{ 
    Base *array[] = 
    { 
     &One(), &Two() 
    }; 
    for (int i = 0; i < 2; i++) 
    { 
     array[i]->execute(); 
     cout << '\n'; 
    } 
} 

Когда я собирал, он дает ошибку в названии:

error: taking address of temporary [-fpermissive] 
&One(), &Two() 
error: taking address of temporary [-fpermissive] 
&One(), &Two() 

Итак, я пытаюсь найти в интернете. И как они говорили:

& A() создает временный объект, который получает разрушенное производственное при выходе из полного выражения автомагически ...

Когда я изменил error line

&One(), &Two() 

до

new One(), new Two() 

Тогда он работает.

Но, как я делаю код происхождения, как писал автор? Должен ли я использовать delete как

delete array[i]; 
+0

Вам нужно выяснить, какой вопрос вы хотите задать здесь. В настоящее время вы спрашиваете двух несвязанных. – juanchopanza

ответ

2

С современными функциями C++ (11 и выше), вы можете обрабатывать такие полиморфные массивы с std::vector<std::unique_ptr<Base>>. vector обеспечивает автоматическое разрушение и расширение, и unique_ptr уничтожит объект на своей собственной гибели:

std::vector<std::unique_ptr<Base>> array; 
array.emplace_back(new One()); 
array.emplace_back(new Two()); 
for(auto &p : array) 
    p->execute(); 
// no explicit cleanup is required here 

Вы можете выбрать другие смарт-классы указателя в качестве элементов вектора, или даже использовать std::array контейнер в виде фиксированного размера, но общая идея такой же для всех подходов:

Не пытайтесь обрабатывать управление памятью вручную, используйте STL-примитивы для таких действий низкого уровня.