C++中嵌套类对象无法初始化的问题

在写嵌套类的代码的时候偶然发现嵌套类对象使用一般的方法无法完成初始化的情况,经过网上查找资料和大佬指点,现已解决该问题。


首先解释嵌套类是什么?一个类可以定义在另一个类里面,那么这个定义在另一个类内的类就叫做嵌套类。嵌套类的对象在另一个类中作为成员存在,定义在类内的模板类也是同理。

接下来看出问题的代码:

#include <iostream>
using namespace std;
template<class T1, class T2>
class A
{
public:
	T1 A_a;
	T2 A_b;
	A(const T1 x,const T2 y):A_a(x),A_b(y){}
	void show() { cout << A_a << A_b << endl; }

	template<class T3>
	class B//定义成员类模板
	{
	public:
		T3 B_a;
		B(const T3 x):B_a(x){}
		void show() { cout << B_a << endl; }
	};
	B<string> bb("错误");	//一般的初始化方法
	
};
int main()
{
	A<string, string> a("你好","CSDN");
	a.bb.show();//出错
}

编译器出错提示: 

以平常的编程习惯去看,代码看似没有问题,但是程序却出错了,问题就在于类内使用()会被当作函数,也就是说编译器将我们创建的嵌套类对象当成了函数。将嵌套类对象初始化的()改成{}即可解决问题,下面是修正后的代码:

#include <iostream>
using namespace std;
template<class T1, class T2>
class A
{
public:
	T1 A_a;
	T2 A_b;
	A(const T1 x,const T2 y):A_a(x),A_b(y){}
	void show() { cout << A_a << A_b << endl; }

	template<class T3>
	class B//定义成员类模板
	{
	public:
		T3 B_a;
		B(const T3 x):B_a(x){}
		void show() { cout << B_a << endl; }
	};
	B<string> bb{"错误"};	//修改后的初始化方法
	
};
int main()
{
	A<string, string> a("你好","CSDN");
	a.bb.show();//正常运行
}

还有另一种令程序正常运行的方法:取消初始化,手工赋值也能避免这种错误的发生。

#include <iostream>
using namespace std;
template<class T1, class T2>
class A
{
public:
	T1 A_a;
	T2 A_b;
	A(const T1 x,const T2 y):A_a(x),A_b(y){}
	void show() { cout << A_a << A_b << endl; }

	template<class T3>
	class B//定义成员类模板
	{
	public:
		T3 B_a;
		B(){}//不进行初始化
		void show() { cout << B_a << endl; }
	};
	B<string> bb{"错误"};	
	
};
int main()
{
	A<string, string> a("你好","CSDN");
    a.bb.B_a="手工赋值"
	a.bb.show();//正常运行
}

第一次写文章,不足之处有请指点,这个问题不是很难,但是是我写代码时真实遇到的,希望可以帮到遇到相同疑惑的朋友,也作自我提醒之用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值