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知らないので、 ofを宣言する必要があります。CVPatModelprotectedSave()CTest::SaveModelToFilefriendCVPatModel

#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に出力します。

にさらに多くのテスト関数を追加する場合CTestfriend class CTestCVPatModel.

于 2013-04-26T07:12:51.373 に答える