класс друга в пространствах имен & amp; разные .H файлы

Я пытаюсь сделать следующую компиляцию под VS 2008 SP1 C++ проект, но friend class заявление не имеет никакого эффекта. (См. Сообщение об ошибке в последнем фрагменте кода.)

Что я делаю не так с friend определение?

// EncryptionTypes.h file
#pragma once

//#include "Encryption.h"   //adding this line doesn't helpusing 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();
}

};

0

Решение

У вас есть проблема круговой зависимости.

Encryption.h нуждается FILE_DATA_CACHE, который определен в EncryptionTypes.h.
Необходимо EncryptionType.h CEncryption, который определен в Encryption.h.

К счастью, вы можете обойтись с помощью предварительной декларации CEncryption в EncryptionType.h.

Измените 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;
}
};
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]