gpt4 book ai didi

c++ - 如何访问派生的 std::shared_ptr?

转载 作者:行者123 更新时间:2023-11-27 22:45:01 25 4
gpt4 key购买 nike

假设我有这样的代码,并且我想访问 myClassB 成员。我怎样才能做到这一点?我需要使用 functionA 的功能。我无法更改它,因为它来自第三方库。我需要使用 functionA 来创建它,并获取它创建的值。在本例中为“Test_1”字符串

class myClassA {
public:
myClassA(){}
~myClassA(){}
};

class myClassB : public myClassA
{
public:
myClassB(){}
void setString1(std::string newString)
std::string getS1()
private:
std::string privateMember;
};

std::shared_ptr<myClassA> functionA()
{
std::shared_ptr<myClassB> temporary(new myClassB());
temporary->setString1("TEST_1");
return std::move(temporary);
}

int main()
{
std::shared_ptr<myClassA> myPtr; // = functionA(); ??
}

最佳答案

理论上,您可以使用 dynamic_cast(或者在这种情况下,具体来说,std::dynamic_pointer_cast 来获取派生指针类型。像这样:

std::shared_ptr<MyClassA> a_ptr = functionA();
std::shared_ptr<MyClassB> b_ptr = std::dynamic_pointer_cast<MyClassB>(a_ptr);
if(b_ptr) {//Check to verify the cast was successful
b_ptr->setString("Test1");
}

然而,对此有一个重要的警告。为了使 dynamic_cast(以及因此 std::dynamic_pointer_cast)工作,您的对象层次结构必须定义一个虚拟表。这意味着至少必须将 MyClassA 定义的方法之一声明为 virtual。最简单的解决方案是声明析构函数 virtual,因为在定义多态对象时这是一个很好的做法(因为您需要它来确保任何派生类正确清理它们的资源)。

class MyClassA {
public:
MyClassA() = default;
virtual ~MyClassA() = default;
};

关于c++ - 如何访问派生的 std::shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44207870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com