0

如果我在 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如果我只是传递指针,我相信这将是传递and之间的区别const int* const& p,但我不确定在这种情况下如何在没有在结构定义中将 member 声明p为 a的情况下执行此操作const int*(这会导致其他部分的复杂化编码)。

4

2 回答 2

1

正如您所注意到的:指针无法修改,但内容可以。

如果你想保留指针,我建议getter/setter:

struct foo {
    void setP(int* p) { this->p = p; }
    int* getP() { return p; }
    const int* getP() const { return p; }
private:
    int* p;
};
于 2015-01-08T17:13:17.073 回答
0

您可以放弃指针而只使用 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

于 2015-01-08T17:21:28.863 回答