Если у меня есть структура в 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*
в определении структуры (что может вызвать осложнения в других частях кода).
Как вы заметили: указатель не может быть изменен, но содержимое может.
Если вы хотите сохранить указатели, я предлагаю получить / установщик:
struct foo {
void setP(int* p) { this->p = p; }
int* getP() { return p; }
const int* getP() const { return p; }
private:
int* p;
};
Вы можете отказаться от указателей и просто использовать 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