C++智能指针赋值初始化

这是一篇简答的小文章,主要目的说明小知识点,我们使用C++类列表初始化的时候,如果使用到初始化的值是基类,而我们new的实例是子类的,如何实现呢:

#include <memory>
#include <iostream>

class cBase
{
public:
	int m_a;
	int m_b;
};

class cSub : public cBase
{
public:
	cSub(int a, int b) :m_a(a), m_b(b) {}
};

int main()
{
	cBase *p = new cSub(1, 2);
	std::cout << p->m_a << " " << p->m_b << std::endl;
	std::getchar();

	return 0;
}

这段代码编译就会有问题,会提示

error C2614: “cSub”: 非法的成员初始化:“m_a”不是基或成员

这就是因为你不能继承类中,生成实例的时候,直接把基类的变量给初始化了,那怎办,两个办法:

1:将基类的变量放到子类,这当然可以,但有违设计初衷啊。

2:将子类构造时,显式构造基类,如下:

class cBase
{
public:
	int m_a;
	int m_b;
};

class cSub : public cBase
{
public:
//	cSub(int a, int b) :m_a(a), m_b(b) {}
	cSub(int a, int b) :cBase{a, b} {}
};

这个就可以实现了,为了更完美,我一般会优化成智能指针实现更好,完整代码如下:

#include <memory>
#include <iostream>

class cBase
{
public:
	int m_a;
	int m_b;
};

class cSub : public cBase
{
public:
//	cSub(int a, int b) :m_a(a), m_b(b) {}
	cSub(int a, int b) :cBase{a, b} {}
};

int main()
{
	std::unique_ptr<cBase> p = std::make_unique<cSub>(1, 2);
	std::cout << p->m_a << " " << p->m_b << std::endl;
	std::getchar();

	return 0;
}

总结:

1:智能指针,列表初始化等,都是C++基操了,必须反复练习,熟练再熟练

2:遇到问题不能回避(如上的方法1),现在有chatgpt和newing大神在,啥问题都好解决。但多练还是非常必要的

猜你喜欢

转载自blog.csdn.net/weixin_45119096/article/details/131444386