Понимание общих указателей класса и его использование в наследовании - PullRequest
0 голосов
/ 18 марта 2019

Мне трудно понять фрагмент кода, приведенный ниже.

class Child1 : public Base1 {
public:
    int Func1(char *Var);
}

class Cls_X: public std::enable_shared_from_this<Cls_X> {
public:
    void Func2(char *Var_copy);
}

Func2 вызывается с Func1 как показано ниже

int Func1(char * Var){
    ...
    make_shared<Cls_X>(ioc, ctx)->Func2(Varcopy_ptr);
    ...
}

Вопросы:

  • Как работает class Cls_X: public std::enable_shared_from_this<Cls_X>? Попробовал поискать в Google, но не смог понять документацию для этого. Может ли кто-нибудь объяснить на простом английском?

  • Являются ли здесь Cls_X и Child1 производным классом Base1?

Примечание:

Тег [boost] добавлен, поскольку пример кода взят из одной из библиотек boost. Пожалуйста, проверьте пример, чтобы увидеть, как shared_from_this используется в программе

Ps 1: - Измените подходящее название, если это возможно.

1 Ответ

1 голос
/ 19 марта 2019

Как class Cls_X: public std::enable_shared_from_this<Cls_X> работает?

Может работать если специализация класса шаблона (здесь std::enable_shared_from_this<Cls_X>) не требует получения типапараметр (здесь Cls_X), который является полным типом.

template <typename T>
struct has_a_member { T mem; };

template <typename T>
struct has_a_pointer { T *ptr; };

struct A : has_a_member<A> // error at this point: 
                           // A is incomplete at this point
                           // the definition of has_a_member<A> cannot be instantiated 
{
};

struct B : has_a_pointer<B> // OK, B is incomplete 
                            // still has_a_pointer<B> can be instantiated
{
};

И enable_shared_from_this предназначен для работы в этом случае, ожидая неполного типа.

...