1.理解PImpl
在头文件定义类
头文件使用
cpp
class Son:public Fater
{
private:
class SonImpl;
SonImpl* pImpl; // 指向实际实现的指针
public:
Son();
~Son();
void show(int x);
void prit();
};
然后cpp文件
cpp
// 实际的实现类
class Son::SonImpl {
public:
void fun1();
void fun2();
void fun3();
void show(int x) {
switch (x)
{
case 1:
fun1();
break;
case 2:
fun2();
break;
case 3:
fun3();
break;
default:
break;
}
}
};
void Son::SonImpl::fun1()
{
cout << "11111" << endl;
}
void Son::SonImpl::fun2()
{
cout << "22222" << endl;
}
void Son::SonImpl::fun3()
{
cout << "33333" << endl;
}
// Son 类的方法实现
Son::Son() : pImpl(new SonImpl()) {} //这里用智能指针更好
Son::~Son() { delete pImpl; }
void Son::show(int x) { pImpl->show(x); }
void Son::prit() { pImpl->show(1); }
好处1.可以减少头文件改动
2.封装性更好 只要传入参数就可以调用不同的函数
有个问题是为什么这里要用指针 若是直接用对象的话 SonImpl这个类没有定义只有声明会报错
2.不管什么继承都不能访问父类的私有成员
3.报错 LNK2019 自己的代码做了修改 返回值是vector类型
LNK2019: 无法解析的外部符号 "public: void __cdecl CSpPublicInterfaces::AddActMenuItem(class std::basic_string<char,struct
这里显示返回值是void类型 是有可能编译器仍然使用旧的编译缓存,没有检测更改。即使修改了函数的返回类型,编译器可能没有重新编译相关的 .cpp
文件 重新生成项目