Как использовать инициализацию массива C # struct в коде C / C ++? - PullRequest
0 голосов
/ 29 марта 2012

Скажите, у меня есть следующая структура в C#:

public struct MyStructCSharp
{
    private byte[] offsets = new byte[] { 28, 20, 27, 36 };
}

Как вы делаете то же самое в C/C++?

Кажется, что следующее не работает:

typedef struct _MyStructCpp
{
    _MyStructCpp()
    {
        offsets[] = {28, 20, 27, 36};
    }

private:
    unsigned char offsets[];
}MyStructCpp;

Ответы [ 5 ]

3 голосов
/ 29 марта 2012

Вы не можете назначить массив после того, как он был объявлен.Кроме того, синтаксис был бы неправильным.Если в нем всего 4 элемента, сделайте это или просто используйте vector, если можете.

struct MyStruct {

  MyStruct() {
    offsets[0] = 28;
    offsets[1] = 20;
    offsets[2] = 27;
    offsets[3] = 36;
  }

private:
  unsigned char offsets[4];
};

Кроме того, не начинайте имена типов с подчеркивания.Они зарезервированы, и это может привести к гадости.

1 голос
/ 29 марта 2012

Предполагая, что у вас есть фиксированное количество значений, правильный ответ Ed * S .

Иначе, вы не можете сделать то же самое, потому что вы можете только инициализировать переменнуючлен в списке инициализатора, и такое назначение не может быть сделано в списке инициализатора.

Однако версия C # возможна благодаря использованию new, поэтому, возможно, это хорошее решение сделать то же самое в C ++однако вам нужно будет иметь длину offsets и присваивать каждому значению индивидуально:

typedef struct _MyStructCpp
{
    _MyStructCpp(int size)
    {
        _size = size; // Say 4
        offsets = new unsigned char[size];
        offsets[0] = 28;
        // etc....
    }
private:
    int _size;
    unsigned char* offsets;
}MyStructCpp;

Однако вы должны иметь в виду, что вы только что выделили динамическую память, поэтому вам следует очистить еев деструкторе.

0 голосов
/ 29 марта 2012

Для массива фиксированного размера используйте std::array<>:

struct MyStructCpp
{
    MyStructCpp()
      : offsets(initOffsets())
    { }

private:
    std::array<unsigned char, 4> offsets;

    static std::array<unsigned char, 4> initOffsets()
    {
        std::array<unsigned char, 4> ret = {{28, 20, 27, 36}};
        return ret;
    }
};

Все не древние компиляторы удаляют видимую копию здесь через NRVO.Для реализаций стандартной библиотеки, в которых отсутствует std::array<>, используйте Boost . Array .

Для массива размером динамически используйте std::vector<>.Не используйте new, кроме как в крайнем случае.

(Кроме того, не связано, но не используйте идиому typedef struct - это идиома C, которая бессмысленна и шумна в C ++.)

0 голосов
/ 29 марта 2012

Если у вас есть поддержка:

struct MyStructCpp
{
    private:
    unsigned char offsets[4]{28, 20, 27, 36};
};

Ну, поскольку у вас нет поддержки:

#include <algorithm>
#include <cstddef>
struct MyStruct
{
    MyStruct()
    {
        unsigned char temp[] = {28, 20, 27, 36};
        std::copy(temp, temp + MAX, offsets);
    }
    private:
    static const std::size_t MAX = 4;
    unsigned char offsets[MAX];
};

(Однако, как уже упоминалось, std::vector будет лучше.Просто показываю, был ли я вынужден использовать простой старый массив.)

0 голосов
/ 29 марта 2012
char offsets[4]={28,20,27,36};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...