Сценарий
Я использую C ++ 17 на MacOS с clang в качестве компилятора.У меня есть несколько классов, которые инициализируются в определенном порядке, показанном в примере кода ниже
Во-первых, SomeClass
, что очень просто и почти глупо для примера.
SomeClass.h
SomeClass {
public:
SomeClass() { }
}
Скажем так: ClassA
вот так.
ClassA.h
ClassA {
public:
ClassA(const std::shared_ptr<SomeClass> & some_class);
private:
std::shared_ptr<SomeClass> m_some_class;
}
ClassA.cpp
ClassA::ClassA(const std::shared_ptr<SomeClass> & some_class) : m_some_class(some_class) {
}
Обратите внимание, что ClassA
вводит тип const std::shared_ptr<SomeClass> &
в свой конструктор и сохраняет его в качестве члена.
Далее идет ClassB
который имеет приватный член ClassA
как std::shared_ptr
.И все, что я хочу сделать, это инициализировать m_class_a
, передав ему требуемый const std::shared_ptr<SomeClass> &
, который ClassA
должен инициализировать его член.
ClassB.h
ClassB {
public:
ClassB(const std::shared_ptr<SomeClass> & some_class);
private:
std::shared_ptr<ClassA> m_class_a;
}
ClassB.cpp
ClassB::ClassB(const std::shared_ptr<SomeClass> & some_class) : m_class_a(some_class) {
}
// Above constructor throws compiler error complaining "No matching constructor for initialisation of `std::shared_ptr<SomeClass>`"
И, наконец, вот мой main.cpp
, который хочет только инициализировать ClassB
main.cpp
int main(int argc, char *argv[])
auto some_cass = std::make_shared<SomeClass>();
ClassB object_b(some_class);
return 0;
}
Вопрос:
Что не так с тем, что я делаю выше, и какова причина этой ошибки компилятора?Как я могу решить проблему?
Дополнительный вопрос:
Что бы изменилось, если бы в ClassB
вместо std::shared_ptr<ClassA> m_class_a
в качестве члена я бы имел ClassA & m_class_a
как участник?