Создание const share_ptr <pure_virtual_class> члена - PullRequest
2 голосов
/ 03 ноября 2011

У меня есть ряд классов, основанных на чистой виртальной основе:

class base {
public:
    virtual int f() = 0;
};

class derived_0 : public base {
public:
    int f() {return 0;}
};

class derived_1 : public base {
public:
    int f() {return 1;}
};

Для краткости я поставил только два производных класса, но на практике у меня их больше.

И яхотел бы создать класс, который имеет общий указатель const на базу.Я хотел бы сделать следующее, но я не могу, так как я должен инициализировать указатель const в списке инициализации:

class C{
public:
    C(bool type) { 
        if(type) {
            derived_0* xx = new derived_0;
            x = shared_ptr<base>( xx );
        }
        else {
            derived_1* xx = new derived1;
            x = shared_ptr<base>( xx );
        }
    } 
private:
    const share_ptr<base> x;
};

Как я могу получить эту функцию?

Ответы [ 2 ]

6 голосов
/ 03 ноября 2011

Вы инкапсулируете создание объекта в функцию, например:

shared_ptr<base> create_base(bool type) {
     if(type) {
         return make_shared<derived_0>();
     }
     else {
         return make_shared<derived_1>();
     }
}

И тогда вы можете использовать его в своем списке инициализации:

class C{
public:
    C(bool type)
    : x(create_base(type))
    {}
private:
    const share_ptr<base> x;
};
3 голосов
/ 03 ноября 2011

В простых случаях, подобных этому точному примеру:

class C
{
    shared_ptr<Base> const x;
public:
    C( bool type ) 
        : x( type
            ? static_cast<Base*>( new Derived_0 )
            : static_cast<Base*>( new Derived_1 ) )
    {
    }
};

(И да, static_cast, или хотя бы один из них, необходимы.)

В более общих случаях, когда логика принятия решений более сложна, вы может захотеть создать статическую функцию, которая возвращает shared_ptr, e.g.:

class C
{
    shared_ptr<Base> const x;
    static shared_ptr<Base> makeSharedPtr( bool type );
public:
    C( bool type )
        : x( makeSharedPtr( type ) )
    {
    }
};

Это позволит любую мыслимую логику (и более сложный набор параметры).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...