0

VS 2008 SP1C++プロジェクトの下で次のコンパイルを試みていますが、friend classステートメントは効果がないようです。 (最後のコードスニペットのエラーメッセージを参照してください)フレンドクラスのネームスペースと異なる.Hファイル

friendの定義で何が間違っていますか?その後、

// EncryptionTypes.h file 
#pragma once 

//#include "Encryption.h" //adding this line doesn't help 


using namespace crypto; 

struct FILE_DATA_CACHE{ 
    FILE_DATA_CACHE() 
    { 
    }; 

    ~FILE_DATA_CACHE() 
    { 
    } 

    friend class CEncryption; 

private: 
    bool _isIndexFileUsed() 
    { 
     return bResult; 
    } 
}; 

// Encryption.h 
#pragma once 

#include "EncryptionTypes.h" 


namespace crypto 
{ 

class CEncryption 
{ 
public: 
    CEncryption(void); 
    ~CEncryption(void); 
private: 
    BOOL _openFile(); 

private: 
    FILE_DATA_CACHE gFData; 
}; 

}; 

そして最後に:

// Encryption.cpp 
#include "StdAfx.h" 
#include "Encryption.h" 


namespace crypto 
{ 

CEncryption::CEncryption(void) 
{ 
} 

CEncryption::~CEncryption(void) 
{ 
} 

void CEncryption::_openFile() 
{ 
    //The line below generates this error: 
    //1>.\Encryption.cpp(176) : error C2248: 'FILE_DATA_CACHE::_isIndexFileUsed' : cannot access private member declared in class 'FILE_DATA_CACHE' 
    //1>  c:\users\blah-blah\EncryptionTypes.h(621) : see declaration of 'FILE_DATA_CACHE::_isIndexFileUsed' 
    //1>  c:\users\blah-blah\EncryptionTypes.h(544) : see declaration of 'FILE_DATA_CACHE' 

    gFData._isIndexFileUsed(); 
} 

}; 

答えて

2

あなたは循環依存の問題を抱えています。

Encryption.hには、FILE_DATA_CACHEが必要です。これはEncryptionTypes.hで定義されています。
Encryption.hにはCEncryptionが必要です。これはEncryption.hで定義されています。

幸運なことに、EncryptionType.hのforward宣言CEncryptionを使用して取得できます。

修正EncryptionType.hへ:

// EncryptionTypes.h file 
#pragma once 

// Can't #include Encryption.h. That will lead to circular 
// #includes. 
namespace crypto 
{ 
    // Forward declaration of crypto::CEncryption 
    class CEncryption; 
} 

struct FILE_DATA_CACHE{ 
    FILE_DATA_CACHE() 
    { 
    }; 

    ~FILE_DATA_CACHE() 
    { 
    } 

    friend class crypto::CEncryption; 

    private: 
    bool _isIndexFileUsed() 
    { 
     return bResult; 
    } 
}; 
+0

私はそれは私が....逃したこれを停止し、ベッドに行く必要があるという単純な何かを知っていました。ありがとう兄貴! – c00000fd