使用指向int或short int的成员创建struct数组?

时间:2017-05-31 07:08:25

标签: c++

我正在尝试实现一个数组结构,它是一个结构数组。该结构具有指向unsigned intunsigned 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;
}

我的问题是:

  1. 是否有可能实现我想象中的数据结构?

  2. 为什么我无法访问派生类数据成员?

2 个答案:

答案 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