2015-01-08 3 views
0
가 ++ 예컨대 동적으로 할당 된 어레이를 포함

CONST 참조 동적 배열 구조체 전달 aFoo.p[]은 함수로 수정할 수 없습니까?I는 C의 구조체가 있다면

int func(foo const& aFoo) { ... }을 선언하면 포인터 aFoo.p을 수정하려고하면 컴파일러 오류가 발생하지만 수정하려고 시도하면 안됩니다 (예 : aFoo.p[0]). 또한 새 포인터 int* p2 = aFoo.p을 할당하고 그 값을 aFoo.p[]으로 수정하는 것도 허용됩니다. 난 그냥 포인터를 전달한다면

, 나는이 통과 int* const& pconst int* const& p의 차이가 될 것입니다 생각하지만, 나는 (구조체 정의의 const int*로 회원 p을 선언하지 않고이 상황에서 그것을 할 방법을 잘 모르겠어요 이는 코드의 다른 부분에서 문제를 일으킬 수 있습니다.)

+1

당신은'INT를 변경하는 경우 그 * (컴파일러 에러로)

#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); } 

라이브 예 : 다음 코드는이 보여줍니다 'std :: vector :: p;' – Jarod42

+0

'typedef struct foo' C++을 사용한다면 이것은 필요하지 않습니다. 필요한 것은'struct foo'뿐입니다. – PaulMcKenzie

답변

1

주의 사항 : 포인터는 수정할 수 있지만 내용은이를 수정할 수 없습니다.

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

질문에 대한 정답이지만, 연민을 위해서 : int대신에 을 사용하십시오. ... –

0

당신은 포인터를 포기하고 단지 표준 : : 벡터를 사용할 수 있습니다 : 당신이 포인터를 유지하려면

, 나는 게터/세터를 제안한다. http://ideone.com/GuJn7d

(오류를 보여주는) 포인터의

라이브 예 : http://ideone.com/rVprYZ

당신이 할 수
+0

감사합니다. 게시물을 편집 할 수는 없지만 구조체의 생성자가 없으므로 코드가 작성된 것으로 작동하지 않는다고 생각합니다. 난'foo aFoo;'가 필요하고,'aFoo.p.resize (1);'뒤에'someFunction()'에'push_back();'을 써야한다고 생각한다. (컴파일러 오류를 제외하고) –

+0

나는 편집했다. resize()를 표시 할 게시물. – PaulMcKenzie