2012-03-04 6 views
3

MSVS2010 콘솔 응용 프로그램에서 다차원 배열로 작업하려고하는데 2D 배열의 멤버에 액세스해야합니다. 배열을다차원 배열 요소에 액세스 C++

Thing::Thing(int _n){ 
    // size of the array 
    this.m = _n; 
    thing = new int*[m]; 
    for(int ii = 0; ii < m; ii++){ 
     thing[ii] = new int[m]; 
    } 
} 

으로 잘 인스턴스화합니다. 하지만 나는 모두의 유사한 구조를 사용하십시오 연산자 =, 또는 운영자 == 할 갈 때 :

Thing& Thing::operator=(const Thing & _thing){ 
    for(int ii = 0; ii < m; ii++){ 
     for(int jj = 0; jj < m; jj++){ 
      thing[ii][jj] = _thing[ii][jj]; //error thrown on this line 
     } 
    } 
    return *this; 
} 

이이 오류

binary "[": 'const Thing' does not define this operator or a conversion to a type acceptable to the predefined operator 
IntelliSense: no operator"[]" matches these operands 

그것이 그대로이 이해가되지 않습니다를 throw를 int 형의 배열, 그리고 "[]"운영자 만 강조하는 오류를 언급하지 않기 변경되지 않았 아래에 놓는다 :

_thing[ii][jj]; 
내가 좀 할당 연산자없이 살 수

,하지만 난 비교 오페라 필요 기능을 가지고 있습니다.

답변

2

에 대한 색인 연산자를 정의해야 혼란 -s. 당신은 아마 갖고 싶어

Thing& Thing::operator=(const Thing & _thing) 

: 이후

thing[ii][jj] = _thing.thing[ii][jj]; 

_thing는

_thing.thing이

+0

는 메모에 대해 2. 감사의 이름을 바꾸는 것을 고려할 것이지만, 대답의 두 번째 언급은 vodeUp입니다. – gardian06

3

과제 루프에서 thing[ii][jj] = _thing.thing[ii][jj];을해야합니다. 또한 두 배열 크기 (this_thing)가 같은지 확인해야합니다. 그렇지 않으면 충돌이 발생할 수 있습니다.

operator[] (색인 연산자)을 내부 배열이 아닌 객체 클래스 Thing에서 사용하려고하기 때문에 오류가 발생합니다. 당신이 배열처럼 Thing 클래스를 사용하려면 당신은 내가 당신이 당신의 "일"을 가지고 생각 그것은 예컨대 :

int* Thing::operator[](int idx) 
{ 
    return thing[idx]; 
} 
+0

크기는 프로그램 기간 동안 일정한 것으로 간주되지만 걱정/알람의 원인을 이해할 수 있습니다. – gardian06

+1

엄밀히 말하면, 인덱스 연산자는 실제로 잘못되었습니다. 그것은'thing'이'int **'로 정의되기 때문에'int *'를 리턴해야합니다. –

+0

잡아 주셔서 감사합니다. 단지 고쳐 주셨습니다. – sirgeorge

2

는 것은이 일이 클래스이다 다차원 배열 인 것 객체입니다 회원, 물건 매개 변수 ... 그리고 operator= 전화로 회원에 액세스하려면 _thing.thing을 사용해야한다는 것을 잊었습니다.

이름 지정 방법이 매우 좋지 않아서 코드를 작성하는 동안 자신을 혼란스럽게 만들었습니다. (그리고 실수를하기 쉽면 다른 사람이 얼마나 쉽게 얻을 수 있는지 상상해보십시오. 이 코드에 의해 혼란스러워 지거나 지금부터 몇 달 안에 당신을 위해).

대신 Array 클래스를 호출하는 경우, data 및 매개 변수 other? 나도 이름에 밑줄이 오는 것을 피할 것을 제안합니다. 동시에 못생긴 위험합니다 (이름에 밑줄을 넣을 수있는 위치와 사용할 수있는 위치의 수에 대한 모든 C++ 규칙을 알고 있습니까?).

클래스 또는 함수를 디자인 할 때는 고려해야 할 것이 많으며 클래스 이름이나 함수 이름은 중요하지만 많은 요소 중 하나입니다. 그러나 데이터 멤버 또는 변수의 경우 유형과 이름 만 선택하면되며 둘 다 가장 중요한 선택입니다.

따라서 특히 변수의 이름에주의 깊게 생각하는 습관을 갖고보십시오. 상대적인 중요성은 그들에게 엄청난 것입니다. 변수와 데이터 멤버는 단지 이름 일뿐입니다 ... 실제로 이름은 프로그래밍에서 변수를 사용하는 유일한 이유입니다 (대신 컴퓨터가 숫자 주소를 사용하고 완벽하게 만족합니다). 아마 당신은 또한 operator[](int)을 정의하고자하는 클래스의 디자인에 대해

...

int *operator[](int index) { return data[index]; } 

은 이렇게 명시 적으로 참조 할 필요없이

Array a(m); 
a[0][0] = 42; 

과 같은 코드를 쓸 수 있습니다 data (그리고 덧붙여서,이 추가는 원래 코드가 작동하도록 할 것이지만 여전히 이름을 수정합니다 !!).