0

Je suis en train de faire la compilation suivante sous VS 2008 SP1C++ projet, mais l'instruction friend class ne semble pas avoir d'effet. (Voir le message d'erreur dans le dernier extrait de code.)classe d'amis à travers les espaces de noms et fichiers .H différents

Qu'est-ce que je fais de mal avec la définition 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; 
    } 
}; 

alors:

// Encryption.h 
#pragma once 

#include "EncryptionTypes.h" 


namespace crypto 
{ 

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

private: 
    FILE_DATA_CACHE gFData; 
}; 

}; 

et enfin:

// 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(); 
} 

}; 

Répondre

2

Vous avez un problème de dépendance circulaire.

Encryption.h a besoin de FILE_DATA_CACHE, qui est défini dans EncryptionTypes.h. EncryptionType.h nécessite CEncryption, défini dans Encryption.h. Heureusement, vous pouvez vous débrouiller en utilisant une déclaration de CEncryption dans EncryptionType.h.

Modifier 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

Je savais qu'il était quelque chose de simple que j'ai manqué .... besoin d'arrêter cela et aller se coucher. Merci mec! – c00000fd