Существуют ли массивы константных указателей в c ++ 03? - PullRequest
1 голос
/ 06 июля 2019

Я довольно новичок в c ++ и пытаюсь создать массив указателей const для хранения ярлыков нескольких структур.

У меня проблема в том, что C ++ 03 (или компиляторЯ использую - gcc 4.4.7), видимо, не поддерживает постоянные массивы указателей?Или, по крайней мере, вы не можете создать их для существующих объектов?

Чтобы уточнить, сами указатели должны быть постоянными, но объекты, на которые они указывают, являются переменными.И структура массива имеет решающее значение, потому что это значительно упрощает мой код, если я смогу получить доступ к этим объектам по индексу позже.

Это для работы с аппаратным обеспечением космического корабля, которое имеет летное наследие или что-то подобное, поэтому использовать его невозможноболее новый компилятор: /

struct Type1 {
    unsigned short thing1;
};
struct Type2 {
    Type1 thing2;
};
struct Type3 {
    Type2 thing3;
};

class A {
    Type3 Array[4];
    Type1 *const pArray[4] = {
        &Array[0].thing3.thing2,
        &Array[1].thing3.thing2,
        &Array[2].thing3.thing2,
        &Array[3].thing3.thing2
    };
};
error: a brace-enclosed initializer is not allowed here before ‘{’ token
error: ISO C++ forbids initialization of member ‘pArray’
error: making ‘pArray’ static
error: invalid in-class initialization of static data member of non-integral type ‘MyType* const [4]’

Так возможно ли сделать то, что я пытаюсь сделать, используя компилятор, который я использую?

1 Ответ

4 голосов
/ 06 июля 2019

Поскольку pArray равно const, требуется инициализатор.Поскольку это нестатическая переменная-член, ее можно инициализировать только из списка инициализатора конструктора.Поскольку это массив, в C ++ 03 для него нет синтаксиса.

Один из возможных способов решения этой проблемы - сделать его не массивом:

#include <cstddef>

struct Type1 {
    unsigned short thing1;
};
struct Type2 {
    Type1 thing2;
};
struct Type3 {
    Type2 thing3;
};

class A {
    struct xarray4 {
        Type1 *data[4];
        xarray4(Type1 *p0, Type1 *p1, Type1 *p2, Type1 *p3) {
            data[0] = p0;
            data[1] = p1;
            data[2] = p2;
            data[3] = p3;
        }
        Type1 *&operator[](std::size_t n) {
            return data[n];
        }
        Type1 *const &operator[](std::size_t n) const {
            return data[n];
        }
    };

    Type3 Array[4];
    const xarray4 pArray;
    A() : pArray(
        &Array[0].thing3.thing2,
        &Array[1].thing3.thing2,
        &Array[2].thing3.thing2,
        &Array[3].thing3.thing2
    ) {
    }
};

Здесь pArrayне массив, а объект с перегруженным operator[].Поскольку это объект, мы можем дать ему собственный конструктор, который позволит нам инициализировать его так, как мы хотим.

С перегруженным оператором [] мы все равно можем обращаться к указателям по индексу.

...