gpt4 book ai didi

C++ 转换自定义类的非指针实例

转载 作者:行者123 更新时间:2023-11-30 00:51:06 24 4
gpt4 key购买 nike

假设我有一个类 A,它有一个子类 B。

class A 
{
public:
A(){};
}

class B : public A
{
public:
B(int value){ foo = value };
int foo;
}

B 是 A 的子类,具有 int foo。

好吧,现在假设我执行以下操作:

std::vector<A> mylist;
B myB(5); //Create a new instance of class B
mylist.push_back(myB); //Add b to my vector of A.

现在我想访问 mylist 的一个元素并将其类型转换为类型 B 并检索“foo”。以下合法吗?

B *instance = (B *)&mylist[0]; 

我已经尝试在我的项目中这样做,但如果我要打印出 foo 的值,那将是不正确的:

std::cout<<instance->foo<<std::endl; // This does not give me 5. It gives me a garbage number.

问题源于我不知道在 C++ 中转换非指针的正确方法。

最佳答案

当您编写 mylist.push_back(myB) 时,会出现一个切片mylist 存储A 对象。所以发生的事情是您的 B 被转换为 A,丢失了 B 而不是 A< 中的所有内容。仅存储 A。您无法找回丢失的碎片。

这等同于:

B myB(5);
A a(myB);

为了具有多态行为,您需要使 A 成为多态类,并且还通过指针引用对象,即 A *

因此您需要向 A 添加至少一个虚函数(虚析构函数是个好主意),并让 vector 存储指针。例如:

std::vector< A* > mylist;
mylist.push_back( new myB(5) );
B *instance = dynamic_cast<B *>(mylist[0]);

现在,这段代码没问题,但你必须非常小心地删除你新建的内存。要为您解决这个问题,可以使用 shared_ptr,它是一个引用计数指针。我做了以下似乎有效的测试用例(免责声明 - 我不是智能指针多态性方面的专家,所以我希望这里没有隐蔽的错误)

#include <iostream>
#include <memory>
#include <vector>

class A
{
public:
A(){};
virtual ~A() {}
};

class B : public A
{
public:
B(int value): foo(value) {}
int foo;
~B() { std::cout << "Destructor B(" << foo << ")" << std::endl; }
};

int main()
{
std::vector< std::shared_ptr<A> > mylist;

// Test the polymorphic behaviour
// mylist.push_back( std::make_shared<A>() );

// create directly into container
mylist.push_back( std::make_shared<B>(5) );

// via pointer
B *temp_b = new B(6);
mylist.push_back( std::shared_ptr<B>(temp_b) );

std::shared_ptr<B> instance = std::dynamic_pointer_cast<B>( mylist[0] );
if ( !instance )
std::cout << "Item was not a B" << std::endl;
else
std::cout << instance->foo << std::endl;
}

关于C++ 转换自定义类的非指针实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22889478/

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