Передача структуры динамических массивов по константной ссылке

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

typedef struct foo {
int* p;
} foo;

foo aFoo;
aFoo.p = new int[n];
for(int i = 0; i < n; ++i)
aFoo.p[i] = 0;

Как я могу передать его по ссылке на функцию, чтобы значения, хранящиеся в aFoo.p[] не может быть изменена функцией?

Если я заявляю int func(foo const& aFoo) { ... }, Я получаю ошибку компилятора, если я пытаюсь изменить указатель aFoo.p, но не если я попытаюсь изменить, например, aFoo.p[0], Мне также разрешено назначать новый указатель int* p2 = aFoo.p и изменить значения aFoo.p[] через это.

Если бы я просто передавал указатель, я считаю, что это будет разница между передачей int* const& p а также const int* const& p, но я не уверен, как это сделать в этой ситуации без объявления участника p как const int* в определении структуры (что может вызвать осложнения в других частях кода).

0

Решение

Как вы заметили: указатель не может быть изменен, но содержимое может.

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

struct foo {
void setP(int* p) { this->p = p; }
int* getP() { return p; }
const int* getP() const { return p; }
private:
int* p;
};
1

Другие решения

Вы можете отказаться от указателей и просто использовать std :: vector. Следующий код показывает это:

#include <vector>

struct foo {
std::vector<int> p;
};

void someFunction(const foo& theFoo)
{
theFoo.p[0] = 10;  // error.
}

int main()
{
foo aFoo;
aFoo.p.resize(1);
someFunction(aFoo);
}

Живой пример (с ошибкой компилятора): http://ideone.com/GuJn7d

Живой пример указателя (без ошибок): http://ideone.com/rVprYZ

0

По вопросам рекламы [email protected]