2012-05-04 2 views
0

int의 2D 배열이 int **로 구현 된 클래스가 있습니다. 나는 그것을 편집 할 수있는에서 사용자를 방지하기 위해 ** CONST의 INT를 반환으로는 다음이 2 차원 배열에 접근 기능을 구현 :int **에서 const int ** 로의 변환이 잘못되었습니다 **

const int** Class::Access() const 
{ 
    return pp_array; 
} 

을하지만 컴파일 오류 "에 INT **에서 잘못된 변환을 얻었다 const int ** ". const로 프로모션이 허용되지 않는 이유는 무엇입니까? 권리를 수정하지 않고 사용자에게 정보에 대한 액세스 권한을 부여하려면 어떻게해야합니까?

+1

참고 : 여기에

int**const int**와 호환되지 않는 이유 의 데모 당신의 변수 이름은 숫자로 시작할 수 없습니다. – chris

+0

맞습니다. 실제로 코드에있는 것이 아닙니다. 이제는 이름을 일반화하는 데있어 저의 감시가 있습니다. –

+0

1D 벡터를 캡슐화하는 Matrix 클래스는 데이터를 보유하기 위해 실제로 잘 작동합니다. 2D 포인터 배열보다 훨씬 낫습니다. 그것은 또한 이와 같은 혼란을 제거합니다. – chris

답변

4

오류의 원인이되는 방법의 오류라고 착각했습니다. Ben이 지적한 것처럼, const - 메서드의 외형은 irrelavent입니다. 외부 포인터 [int에 대한 포인터]의 값에만 적용되므로 변경 가능한 버전에 쉽게 복사 할 수 있습니다.

int const * const * Class::Access() const 
{ 
    return pp_array; 
} 

작동합니다 : 당신이 int의 일정에 int s와 포인터를 모두 확인해야합니다 (원하는 결과 인) 데이터를 보호하기 위해

.

당신이 앞에있는 CONST을 선호하는 경우도 있으므로 같은 선언을 작성할 수 있습니다

const int * const * Class::Access() const; 

하지만 두 번째 const이 포인터에 적용하기 때문에, 그것이 const처럼 오른쪽 (에 배치되어야합니다

별표의 방법에 적용되는).

+0

const가 int보다 먼저 제거 된 이유는 무엇입니까? 여기에 여전히 일정한 데이터가 있습니까? –

+1

@BugalugsNash, 오른쪽에서 왼쪽으로 읽으십시오. int는 여전히 const입니다. 그러나 const의 왼쪽에는 아무 것도 없으면 오른쪽에 적용됩니다. – chris

+0

const before/after int는 같습니다.'*'심볼에 비유 해 의미가 바뀌면 –

5

Greyson은 const int* const*을 사용하려고하지만 올바른 이유는 설명하지 않았습니다.

const int ci = 0; 
const int* pci = &ci; 
int* pi; 
int** ppi = π 
const int** ppci = ppi; // this line is the lynchpin 
*ppci = pci; 
*pi = 1; // modifies ci! 
+0

이것이 올바른 동안이 인스턴스에서 int **가 const 일 필요가있는 이유를 설명하지 않습니다. 메서드의 'const'는 int에 대한 포인터에 대한 가변 포인터를 반환하는 것이 중요한 이유입니다. – Greyson

+0

거기에, 지금은 :) – Greyson

+0

@ 그레이슨 : 방법의'const' - 차이는 아무런 차이가 없으며,'pp_array = anything'을 쓰는 사람은 아무도 없습니다. 방금 추가 한 새로운 문구가 추론이 완전히 틀린 이유에 대한 설명입니다. –

관련 문제