1

我有以下内容:

typedef SP<CVPatModel *> VModel;


class VLIB_API CVPatModel
{
public :

    friend VModel;

protected :

    virtual void Save( char* szFileName );

}


void CTest::SaveModelToFile( VModel ModelPtr, char* szFileName )
{

    ModelPtr->Save(szFileName);
}

我将得到“无法访问在类 'CVPatModel' 中声明的受保护成员”。

无论如何我可以通过 VModel 访问 Save() 吗?

谢谢!

4

1 回答 1

0

您不必弄乱智能指针类的内部结构,因为会ModelPtr->生成一个CVPatModel*. 因为你的类CTest不知道CVPatModel's 的protected成员Save(),你必须声明CTest::SaveModelToFile一个friendof 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,不妨friend class CTestCVPatModel.

于 2013-04-26T07:12:51.373 回答