代码之家  ›  专栏  ›  技术社区  ›  c00000fd

跨命名空间和不同的.H文件的友元类

  •  0
  • c00000fd  · 技术社区  · 7 年前

    VS 2008 SP1 C++ 项目,但 friend class

    我做错了什么 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();
    }
    
    };
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   R Sahu    7 年前

    您有一个循环依赖性问题。

    FILE_DATA_CACHE ,这在EncryptionTypes.h中定义。
    加密类型。h需要 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;
       }
    };