Как создать динамически размещаемый массив константных объектов, но им назначены значения? - PullRequest
2 голосов
/ 03 ноября 2011

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

Мне нужно это для переменной Samples этого класса SFML .

Как мне это сделать?

Ответы [ 5 ]

3 голосов
/ 03 ноября 2011

Вам не нужен массив из const объектов. Указатель на const может указывать на постоянные или неконстантные объекты; Вы можете создать динамический массив и инициализировать Chunk структуру из него следующим образом:

std::vector<Int16> samples;
initialise(samples);

// valid until 'samples' is destroyed or resized
SoundStream::Chunk chunk = {&samples[0], samples.size()};
2 голосов
/ 03 ноября 2011

Легко:

// Step 1: Make an array of const values:
const int arr[] = { 1, 4, 9, 17 };

// Step 2: Make a pointer to it:
auto        parr     = &arr; // 2011-style
const int (*pbrr)[4] = &arr; // old-style

Вы не можете «присваивать» значения константам (очевидно), поэтому единственный способ наделить константу значением - это инициализировать это значение.

1 голос
/ 03 ноября 2011

Или, если данные не известны во время компиляции:

const std::vector<int> function() {
    std::vector<int> tmp(5); //make the array
    for(int i=0; i<5; ++i)
        tmp [i] = i; //fill the array
    return tmp;
}
0 голосов
/ 03 ноября 2011

Сделайте выделение, присвойте ему указатель на non-const. Сделайте ваши изменения в данных. Когда вы покончили с вещами, вы можете назначить свой константный указатель на массив. Например:

int * p = new int[100];
for (int i=0; i<100; ++i)
    p[i] = i;

const int * cp = p;
0 голосов
/ 03 ноября 2011

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

std::vector<Int16> data;
Chunk* c = ...;

data.push_back(...);

c->Samples = &data[0];
...