场景
我正在 MacOS 上使用 C ++ 17 和 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 {
public:
ClassB(const std::shared_ptr<SomeClass> & some_class);
private:
std::shared_ptr<ClassA> m_class_a;
}
。
ClassB.h
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>`"
ClassB.cpp
main.cpp
最后,这是我的ClassB
,只想初始化int main(int argc, char *argv[])
auto some_cass = std::make_shared<SomeClass>();
ClassB object_b(some_class);
return 0;
}
main.cpp
ClassB
问题:
我上面做的事情有什么问题,并且此编译器错误的原因是什么?我该如何解决该问题?
次要问题:
如果在std::shared_ptr<ClassA> m_class_a
中使用ClassA & m_class_a
作为成员,而不是将{{1}}作为成员,将会发生什么变化?
答案 0 :(得分:2)
您的问题是,您正在尝试初始化类型为std::shared_ptr<ClassA>
的变量,但是给了它一个std::shared_ptr<SomeClass>
。它们不兼容。
您是否要创建新的ClassA
?在这种情况下,构造函数应为:
ClassB::ClassB(const std::shared_ptr<SomeClass> & some_class)
: m_class_a(std::make_shared<ClassA>(some_class))
{}