我正在尝试实现一个数组结构,它是一个结构数组。该结构具有指向unsigned int
或unsigned short int
的指针。
我的第一次尝试是让struct的数据成员指向基类。基类有两个派生类。 g ++和clang都给出了错误(在'Base'中没有名为'myArray'的成员)
在我的第二次尝试中,我使用了void指针,但两个编译器再次发出错误(错误:指向不完整类型'void'的指针的下标)
struct Base { uint32_t *x; };
struct Derived16 : public Base { uint16_t *myArray; };
struct Derived32 : public Base { uint32_t *myArray; };
struct SpecialStruct {
char *name;
uint32_t id;
Base *specialArray;
};
struct SpecialStruct2 {
char *name;
uint32_t id;
void *specialArray;
};
int main() {
// First Attempt
SpecialStruct myStructs[10];
myStructs[0].specialArray = new Derived32;
myStructs[1].specialArray = new Derived16;
myStructs[0].specialArray->x = new uint32_t[10];
myStructs[0].specialArray->myArray = new uint32_t[10];
// ^-- error: no member named 'myArray' in 'Base'
// Second Attempt
SpecialStruct2 myStructs2[10];
myStructs2[0].specialArray = new uint32_t[10];
myStructs2[1].specialArray = new uint16_t[10];
myStructs2[1].specialArray[0] = 1;
// ^-- error: subscript of pointer to incomplete type 'void'
return 0;
}
我的问题是:
是否有可能实现我想象中的数据结构?
为什么我无法访问派生类数据成员?
答案 0 :(得分:2)
"适当"解决方案是使用 templates 。但是要解决您的问题,void*
可以指向任何,编译器也不知道它实际指向的是什么。您必须将指针强制转换为正确的类型:
static_cast<Derived32*>(myStructs[0].spcialArray)->x = ...;
答案 1 :(得分:1)
这样的事情:
struct BaseStruct{
virtual ~BaseStruct() {}
};
template<class T>
struct SpecialStruct: public BaseStruct{
char *name;
uint32_t id;
T * spcialArray;
public:
virtual ~SpecialStruct(){}
};
int main() {
// First Attempt
vector < BaseStruct*> myStructs;
SpecialStruct<uint32_t> * myStruct =new SpecialStruct<uint32_t>;
myStruct->spcialArray = new uint32_t[10];
myStruct->spcialArray[0] = 1;
myStructs.push_back(myStruct);
SpecialStruct<uint32_t>* t = (SpecialStruct<uint32_t>*) myStructs[0];
cout << t->spcialArray[0];
return 0;
}
您还可以将unique_ptr用于向量,并将虚方法添加到Struct