2011-09-29 7 views
0

배열에 대한 개인 포인터가있는 클래스가 있다고 가정합니다. getter를 사용하여 다른 변수에서 액세스 할 수 있도록 데이터에 액세스 (또는 효과적으로 데이터 복사)하는 방법은 무엇입니까? -9.2559631349317831e+061이 경우 배열에 대한 포인터를 반환

class MyClass 
{ 
    private: 
     double *x; 
    public: 
     myClass(); 
     virtual ~MyClass(); 
     double* getX() const; 
     void setX(double* input); 
}; 

MyClass::MyClass() 
{ 
    double foo[2]; 
    double * xInput; 
    foo[0] = 1; 
    foo[1] = 2; 

    xInput = foo; 
    setX(xInput); 
} 

void MyClass::setX(double * input) 
{ 
    x = input; 
} 

double * MyClass::getX() const; 
{ 
    return x; 
} 

int main() 
{ 
    MyClass spam(); // Construct object 
    double * bar = spam.getX(); // This doesn't work 
} 

는 바 [0] [1] jibberish 동등한 바. 인수가없는 및 ​​ MyClass을 반환 spam라는 함수를 선언하는 객체를 구성하지 않습니다

+0

나는 SE에서 비슷한 질문을 찾을 수 없다는 것에 놀랐지 만, 누군가가 나를 틀리게 증명한다면, 가까운 대답을하자. – Elpezmuerto

+2

오류가 발생하면 알려주십시오. –

+0

"이 작동하지 않습니다"대신 정확한 컴파일러 출력을 제공하는 것이 좋습니다. – unwind

답변

3

그냥 추측하면 프로그램이 충돌하거나 잘못된 출력을 표시합니다. 이는 생성자가 범위를 벗어나 생성자의 끝에서 소멸되는 로컬 배열에 대한 포인터를 설정하기 때문입니다.

+0

그러면 생성자에서 어떻게 수정합니까? – Elpezmuerto

+0

@Elpezmuerto : MyClass는'double foo [2]'멤버가 필요합니다. 그렇지 않으면 동적 메모리를 사용해야합니다. (동적 메모리의 경우 C++ 책에서 더 멀리 읽으십시오) –

+0

@Elpezmuerto, 사라지지 않을 배열로 포인터를 초기화해야합니다. 클래스의 멤버, 정적 변수, 생성자에 전달 된 매개 변수 또는 'new'로 할당 된 항목 일 수 있습니다. 할당 할 경우 포인터를 소유하고 있는지 또는 setX를 통해 제공되었는지 알고 있어야하는 시점에서 '삭제'해야합니다. –

7
MyClass spam(); // Construct object 

.

MyClass spam; // Construct object 

자세한 내용은 구글 가장 성가신 구문 분석 :이 기본 객체를 구축합니다.

업데이트 : @ Mark Ransom이 지적했듯이 코드에 또 다른 문제가 있습니다. 생성자에서 배열을 만든 다음 해당 배열을 가리 키도록 x을 설정합니다. 그러나 생성자가 실행을 완료하면 배열 수명이 끝나기 때문에 x에 대한 추가 액세스가 중단됩니다 (충분히 운이 좋으면).

+1

이 사람이 뭐라했는지! :) – MGZero

+1

+1 재미있는 정보! –

+2

그리고 그것이 너무 짜증나는 이유는 그것이 발견하기 어렵다는 것입니다 - 나는 확실히 그것을 놓쳤습니다. +1 –

0

bar [0] 대신 * bar 여야합니다.

+3

C와 C++에서 모두 동일하다. –

+0

예, 물론 정확합니다 :-) – Dabbler

관련 문제