2012-05-12 3 views
1

저는 실수를하는 것이 너무 바보 같아요. 내가 뭘 잘못하고 있는지 모르겠습니다. 정적 및 비 정적 변수와 일부 메서드를 모두 포함하는 클래스가 있습니다. 내 프로그램에서 개체를 만들고이 개체를 참조로 일반 메서드에 전달하고 싶습니다.메서드를 참조하여 객체를 전달하십시오.

프로그램이 컴파일되지 않고 컴파일러에서 정말 이상한 오류 메시지가 발생합니다. ccbRZYqe.o에 ccbRZYqe.o prueba : prueba()에 ccbRZYqe.o에 _main metodoC (prueba *를)에서 참조 "prueba : NUM", :

정의되지 않은 아키텍처 x86_64에 대한 상징 prueba :: 크리에이터() ccbRZYqe.o의에서 참조 "prueba :: 플래그": ccbRZYqe.o 에 metodoC (prueba의 *) prueba :: prueba() ccbRZYqe.o prueba :: 크리에이터의()에서 ccbRZYqe.o ld : 아키텍처 x86_64에 대한 기호가 없습니다. collect2 : ld가 1 종료 상태를 반환했습니다.

코드

#include <iostream> 

using namespace std; 

class prueba 
{ 
    private: 
    public: 
     static bool flag; 
     static int num; 
     float complejo; 

     // Metodos 
     //-------------- 
     prueba() 
     { 
      flag = false; 
      num = 0; 
      complejo = 0.0; 
     } 

     void inicio() 
     { 
      flag = true; 
      num = 5; 
      complejo = 3.2; 
     } 

     bool cambio() 
     { 
      flag++; 
      num++; 
      complejo++; 
     } 
}; 

bool metodoC(prueba* ensayo) 
{ 
    cout << "-----------------------------------------" << endl; 
    cout << "- flag: " << ensayo->flag << endl; 
    cout << "- num: " << ensayo->num << endl; 
    cout << "- Complejo: " << ensayo->complejo << endl; 
    cout << "-----------------------------------------" << endl; 

    return true; 
} 

//----------------------------------- 
//  M A I N 
//----------------------------------- 
int main(int argc, char *argv[]) 
{ 
    prueba test; 

    test.inicio(); 

    test.num += 2; 
    test.complejo += 5.2; 

    metodoC(&test); 

    return 0; 
} 

답변

5

정적 멤버를 정의해야합니다. 그들은 단지 선포되었습니다.

class prueba { 
    // as before 
}; 

구현 파일

: 각 번역 단위에 대한 정적의 정의를 얻을 것이다 때문에 헤더에 정의를 넣으면 안됩니다

bool prueba::flag=false; 
int prueba::num=0; 

참고. 이 파일을 구현 파일에 넣어야합니다.이 파일은 클라이언트가 빌드 할 수있는 단일 오브젝트 파일을 만드는 데 사용됩니다.

prueba 개체를 인스턴스화 할 때마다 생성자의 정적 멤버를 다시 설정해야합니다.

+0

답장을 보내 주셔서 감사합니다./Gracias por tu respuesta. –

+0

@ JorgeVegaSánchez de nada. 중복 된 심볼에 대해 문장 하나를 추가 했으므로'prueba' 클래스를 사용하는 번역 단위가 둘 이상있는 경우 중요 할 수 있습니다. – juanchopanza

0

prueba의 num 값이 정적으로 선언되어 있기 때문에 오류가 발생한다고 생각합니다. test.num이 작동하지 않아이 값이 정의되지 않은 이유입니다.

prueba :: num + = 2로 변경하면; 또한 적절한 초기화에 추가 확인 작업을해야 :

bool prueba::flag = false; 
int prueba::num = 0; 
클래스
+0

둘 모두 회원에게 액세스하는 데 유효한 방법입니다. – chris

+0

@ CD1212 필수 항목은 아니지만 멤버가 특정 인스턴스에 속해 있지 않다는 이해력을 향상시킵니다. 문제는 정적 멤버를 번역 단위에서 정의해야한다는 것입니다. – Mahesh

1

정적 멤버는 클래스 내에서 선언하지만

 `bool prueba::flag=false;` 
     int prueba::num=0;` 

수업 후 다음을 추가에서 자신의 해상력을 제거 클래스 외부에 정의되어야한다 생성자 내부.

괜찮습니다.

+1

사실 그들은 클래스 내부에서 (선언 된대로) 선언되고 외부에서 정의되어야합니다. – juanchopanza

관련 문제