기본 데이터 형식에 대한 포인터를 보유 할 구조체 데이터를 디자인해야합니다. 사용자는이 데이터 구조체의 객체를 쉽게 생성 할 수 있어야하며 메모리 관리 문제를 많이 처리하지 않아도됩니다.다형성 데이터를 처리하기위한 데이터 클래스를 디자인하는 올바른 방법
구조가 거의 작성되지 않았습니다. 올바른 방법을 제안하십시오.
struct BaseData {
enum DataType { DATATYPE_1, DATATYPE_2 };
virtual ~BaseData() { cout << "BaseData Dtor" << endl; }
};
struct DataType1 : BaseData {
virtual ~DataType1() { cout << "DataType1 Dtor" << endl; }
};
struct DataType2 : BaseData {
virtual ~DataType2() { cout << "DataType2 Dtor" << endl; }
};
struct Data {
Data() { cout << "Data Ctor" << endl; }
Data(const Data& o) {
if (o.baseData->type == BaseData::DATATYPE_1) {
baseData = new DataType1;
*(static_cast<DataType1*>(baseData)) = *(static_cast<DataType1*>(o.baseData));
}
else if (o.baseData->type == BaseData::DATATYPE_2) {
baseData = new DataType2;
*(static_cast<DataType2*>(baseData)) = *(static_cast<DataType2*>(o.baseData));
}
}
virtual ~Data() {
cout << "Data Dtor" << endl;
delete baseData; //here it results in segmentation fault if object is created on stack.
baseData = NULL;
}
BaseData* baseData;
};
vector <Data> vData;
void addData(const Data& d) { cout << "addData" << endl; vData.push_back(d); }
클라이언트 코드는 다음과 같습니다.
int main()
{
{
DataType1 d1;
d1.type = BaseData::DATATYPE_1;
Data data;
data.baseData = &d1;
addData(data);
}
{
BaseData* d2 = new DataType2;
d2->type = BaseData::DATATYPE_2;
Data data;
data.baseData = d2;
addData(data);
delete d2;
d2 = NULL;
}
{
Data data;
data.baseData = new DataType1;
static_cast<DataType1*>(data.baseData)->type = BaseData::DATATYPE_1;
addData(data);
delete data.baseData;
data.baseData = NULL;
}
}
블록 1과 블록 2의 코드가 이중 삭제로 인해 충돌합니다. 이러한 모든 유스 케이스를 어떻게 적절하게 처리 할 수 있습니까?
내가 생각한 한 가지 방법은 비공개를 사용하여 baseData 포인터를 숨기고 setBaseData(const BaseData& o)
의 struct Data
에 메소드를 제공하는 것입니다. setBaseData와
void setBaseData(const BaseData& o) {
cout << "setBaseData" << endl;
if (o.type == BaseData::DATATYPE_1) {
baseData = new DataType1;
*(static_cast<DataType1*>(baseData)) = static_cast<const DataType1&>(o);
}
else if (o.type == BaseData::DATATYPE_2) {
baseData = new DataType2;
*(static_cast<DataType2*>(baseData)) = static_cast<const DataType2&>(o);
}
}
는() 나는 세그먼트 오류와 사용자를 방지 할 수 있어요 이제까지 그가 좋아하는 구조체 데이터의 개체를 만들 무료입니다.
이러한 클래스를 설계하는 더 좋은 방법이 있습니까?