2013-03-12 3 views
1

저는 C++을 처음 사용하여 다음 작업을 수행하려고합니다 :클래스 배열 및 대입 연산자

"sim"이라는 간단한 클래스가 있습니다. 나는 "sim"타입 클래스의 10 가지 요소의 배열을 만들고 싶습니다. 그래서 sim** a = new sim*[10]을 사용했습니다.

그런 다음 루프를 실행하여 a[i]=new sim(i)과 같은 새로운 요소를 만듭니다. 그러나 나중에 각 a [i]의 값 (필드)을 인쇄하려고 할 때, 나는 무엇을 제외하고 얻을 수 없습니다. 여기

코드입니다 :

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

class sim{ 
private: 
    int x; 
    const int y; 
public: 
    sim(); 
    sim(int z); 
    ~sim(); 
    void showInfo(); 
    sim& operator=(const sim& s); 
}; 

sim::sim():y(10),x(0) 
    {} 

sim::sim(int z):y(10),x(z) 
    {} 

sim::~sim() 
    {} 

void sim::showInfo() 
    { 
    cout<<"x="<<x<<", y="<<y<<endl; 
    } 

sim& sim::operator=(const sim& s) 
    { 
    x=s.x; 
    return *this; 
    } 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    sim** a = new sim*[10]; 
    for(int i=0;i<10;i++) 
    { 
     a[i]= new sim(i); 
    } 

    for(int i=0; i<10; i++) 
     (*a)[i].showInfo(); 
    getchar(); 
    return 0; 
} 

그리고 여기에 잘못된 출력 :

x=0, y=10 
x=-33686019, y=-830047754 
x=-33686019, y=-572662307 
x=1869774733, y=201385040 
x=725928, y=726248 
x=1423328880, y=11 
x=24, y=2 
x=55, y=-33686019 
x=4814584, y=-1 
x=0, y=0 

Y는 항상 10이어야한다, x는 0-9이어야합니다. 내가 뭘 잘못하고 있니? 감사합니다.

+3

단순히 뭐가 잘못 'sim arr [10];'? – jrok

+0

의도적으로'std' 라이브러리를 사용하지 않습니까? –

+0

Alex : 예. 이것은 숙제이며, 우리는 표준 라이브러리를 사용할 수 없습니다. jrok : 나는 그것을 시험해 보았습니다. 운이 없었습니다. sim ar [10]을 할 때 sim [i] = new sim (i)을 사용할 수 없습니다. – bomba6

답변

2

문제는 당신의 문

(*a)[i].showInfo(); 

이것은 당신이에 색인되어,이 SIM 인스턴스에 당신에게 포인트를주는 역 참조됩니다에 작업 순서입니다. 대신에 색인을 생성 한 다음 결과를 역 참조하십시오.

(*(a[i])).showInfo(); 

위의 괄호는 명확하게하기위한 것입니다. 고려할 때 C++ 연산자 우선 순위는 안전하게 그 라인을 쓸 수로 :

(*a[i]).showInfo(); 

당신의 기괴한 출력하는 이유는 힙에서 어떤 임의의 위치에있는 새로운 할당 제 1 심 인스턴스 떨어져 색인된다는 것입니다 기억. 당신은 단순한 메모리 인스턴스를 마치 sim 인스턴스처럼 다루기 때문에 정의되지 않은 멤버 값이됩니다.

+0

이것은 문제를 해결하는 것 같습니다 ... 고마워요! – bomba6

2
(*a)[i].showInfo(); 

이것은 올바르지 않습니다. 그러면 다음과 같은 결과가 출력됩니다.

(*((*a) + i)).showInfo(); 

이것은 분명히 원하는 것은 아닙니다.

a의 i-th 값이 가리키는 주소에 저장된 객체의 showInfo 메소드에 액세스하려고합니다.

(*(a[i])).showInfo(); 

을 그리고 당신이 그 끔찍한 참조 연산자를하지 않도록 당신은, 그 몇 가지 구문 설탕을 추가 할 수 있습니다 :

그래서 당신이 작성해야

a[i]->showInfo(); 
+0

'sizeof (sim *)'를 곱하면 안됩니다. –

+0

@metal 허용 될 수도 있다고 생각했지만 확실하지 않았습니다. 명확히 해 주셔서 감사합니다. – antonijn

관련 문제