因为ModelPtr->
产生了CVPatModel*
,所以您不必乱搞智能指针类的内部。因为您的课CTest
不知道约CVPatModel
的protected
成员Save()
,您必须申报CTest::SaveModelToFile
a friend
的CVPatModel
。
#include <memory>
#include <iostream>
template<typename T>
using SP = std::shared_ptr<T>;
class CVPatModel;
typedef SP<CVPatModel> VModel;
class CTest
{
public:
void SaveModelToFile(VModel ModelPtr, const char* szFileName);
};
class CVPatModel
{
public :
friend void CTest::SaveModelToFile(VModel, const char*);
protected :
virtual void Save(const char* szFileName) { std::cout << "saving to file \"" << szFileName << "\" succeeded!\n"; };
};
void CTest::SaveModelToFile(VModel ModelPtr, const char* szFileName)
{
ModelPtr->Save(szFileName);
}
int main()
{
VModel vm = std::make_shared<CVPatModel>();
CTest ct;
ct.SaveModelToFile(vm, "bla");
}
输出在Ideone。
如果您开始向CTest
添加更多测试功能,那么您最好在CVPatModel
内部放置friend class CTest
。
使CTest :: SaveModelToFile()成为SP <>的朋友。 – 2013-04-26 03:37:43
SP <>是一个普通的智能指针类,所以我不能使CTest :: SaveModelToFile()成为它的朋友。 – AvatarBlue 2013-04-26 03:41:26
我的答案是否适合你?如果没有,请帮助我改进它。 – TemplateRex 2013-05-01 09:22:07