Я изучаю C++, недавно я столкнулся с проблемой и не знаю почему.
Я хочу скрыть данные полей частных членов от внешних пользователей, поэтому я просто объявляю указатель void * как единственное поле частного члена, а затем объявляю структуру полей реальных членов в исходном файле исходного кода.cpp. новую эту внутреннюю скрытую структуру в конструкторе класса и удалить ее в деструкторе класса.
Ниже приведены мои тестовые коды:
#pragma once
class ItemA
{
private:
void* pFields;
public:
ItemA();
~ItemA();
};
#include "ItemA.h"
#include <string>
using namespace std;
typedef struct
{
int intField;
string strField;
} HFIELDS, *PHFIELDS;
ItemA::ItemA()
{
this->pFields = new HFIELDS;
PHFIELDS pHFIELDS = (PHFIELDS)this->pFields;
pHFIELDS->intField = 100;
pHFIELDS->strField = "100";
}
ItemA::~ItemA()
{
PHFIELDS pHFIELDS = (PHFIELDS)this->pFields;
delete pHFIELDS;
}
#pragma once
#include "ItemA.h"
class ItemB
{
private:
void* pFields;
ItemB();
public:
ItemB(ItemA &itemA);
~ItemB();
};
#include "ItemB.h"
#include <string>
using namespace std;
typedef struct
{
ItemA* pItemA;
int intField;
string strField;
} HFIELDS, *PHFIELDS;
ItemB::ItemB(ItemA &itemA)
{
this->pFields = new HFIELDS;
PHFIELDS pHFIELDS = (PHFIELDS)(this->pFields);
pHFIELDS->pItemA = &itemA;
pHFIELDS->intField = 200;
pHFIELDS->strField = "200";
}
ItemB::~ItemB()
{
PHFIELDS pHFIELDS = (PHFIELDS)this->pFields;
delete pHFIELDS;
}
#include <tchar.h>
#include "ItemA.h"
#include "ItemB.h"
int _tmain(int argc, _TCHAR* argv[])
{
ItemA* pItemA = new ItemA();
ItemB* pItemB = new ItemB(*pItemA);
delete pItemB;
delete pItemA;
return 0;
}
Когда выполнение программы перешло к конструктору ItemB, эта строка разбилась:
pHFIELDS-> strField = "200";
Может ли кто-нибудь сказать мне, что с этим не так? Спасибо.
PS Я использую среду разработки MSVC2013.
почему у вас есть 2 заявления HFIELDS и * PHFIELDS
1) В ItemA.cpp
typedef struct
{
int intField;
string strField;
} HFIELDS, *PHFIELDS;
2) В ItemB.cpp
typedef struct
{
ItemA* pItemA;
int intField;
string strField;
} HFIELDS, *PHFIELDS;
Что происходит, ItemA.h включен в ItemB, поэтому компилятор видит 2 объявления.
Пожалуйста, измените имя и скомпилируйте.
Надеюсь это поможет.