객체 포인터 배열에 대해 질문좀 드리겠습니다. ^^
갤1
제가 책에 있는 연습 문제를 따라하고 있는데잘 이해가 안가서 이렇게 질문을 드립니다.
제가 Point라는 클래스를 선언하고 그 안에 ShowPoint()라는 함수를 만들었습니다.
그리고 객체 포인터 배열로 Point* arr[5]를 선언한 후...
루프를 5번 돌려 x, y 좌표를 입력받아서 초기화 한 후...
다시 루프를 돌려각각5개의 객체의 포인트 좌표를 출력하는 프로그램을 작성했습니다.
저는 당연히 이게 될줄 알았는데 에러가 납니다....
for(int j=0; j5; j++){
*arr[j].ShowPoint(); -요놈이 에러;;;;
}
이게 에럽니다.각각의 배열 요소에는 객체의 주소값이 저장되어 있고 거기에 *를 붙이면
그 객체의 실체를 가리키게 되고 접근연산자 .으로 접근이 하면 되는거 아닌가요?
참고로 ShowPoint 함수는 이렇습니다.
void Point::ShowData(){
coutx : xendl;
couty : yendl;
}
참으로 c++은 오묘합니다... ㅠㅠ
-
그댸와나
* 와 . 는 모두 연산자 인데요, . 이놈이 우선순위가 높습니다. 그래서 *arr[j].ShowPoint() 하시면 *(arr[j].ShowPoint()) 와 같은 순서로 실행됩니다.
-
휑하니
객체의 포인터로 그 객체의 함수가 접근이 잘못되거나 안되었다면 access violation error 가 발생했을겁니다. ShowData()함수안에 쀍포인트를 걸어서 디버깅 해보세요
-
힘차
답변 감사드립니다! ^^ 그런데 *arr[j].showpoint()와 (*arr[j]).showpoint()는 다른 건가요???;;;; 그리고 심수다님이나 conquestor님께서 하신 것처럼 하면 에러없이 실행이 되는데여...;;; 근데 문제는 5번 입력받는 것 까지는 되는데 출력이 안되고 press any key나오고 정상 종료되버리네염...;;;;; 객체 포인터에서는 함수 접근이 안되는건지...;;;
-
남
arr[j] 자체만 보면 그 값은 포인터 이지요
그러니께
arr[j]-ShowPoint(); 로 하시거나
(*arr[j]) 자체만 보면 그 포인터가 가르키는 객체지요?
그러니께
(*arr[j]).ShowPoint(); 로 해주시면 됩니다
(*arr[j]).ShowPoint(); 와 arr[j].ShowPoint(); 는 다른거니께요 -
늘봄
클래스를 객체포인트 배열에 넣으셨으면 연산자는 -(애로우연산자)를 사용해야되는거 아닌가요? 그리고 결과값을 보실때 *arr[j]이 부분에서 연산자 우선 순위도 고려해서 하셔야 할듯 합니다. 저도 잘 기억이 안나서리~ ㅎㅎㅎ