2010-03-23 11 views
-1

저는 리눅스에서 C++로 작업하는 것에 익숙하지 않기 때문에 몇 가지 문제가 있습니다. 그 중 하나는 클래스를 작성한 후 해당 클래스의 객체를 인스턴스화하려고하면 다음과 같은 오류가 발생합니다. "정의되지 않은 참조 Constructor_of_that_class "를 참조하십시오. 이것은 필자가 작성하는 모든 클래스에서 발생하며 코드가 아무런 문제없이 컴파일 되더라도 인스턴스화를 시도 할 때 아무 문제가 발생하지 않습니다. 무엇이 잘못되어 있으며이 오류를 극복하기 위해해야 ​​할 일은 무엇입니까? 내가 일하는 프로젝트가 나에 의해 만들어지지 않았기 때문에 나는 어떤 설정으로 뭔가를해야한다고 생각하지만 어떤 것이 있는지 모른다. (주석에서 붙여 넣기)정의되지 않은 참조

편집 :이 클래스를 정의 잘 경우

:

class test { 
    public: 
     int a*; 
     test(int* a) 
} 

class test { 
    test::test(int* a) 
     { 
      this->a=a; 
    } 
} 

다음 이전에 정의 된 곳 사람들의 모든 클래스에서 내가 사용

test t =new test(anIntPointer); 

그렇다면 test::test(int*)에 대한 정의되지 않은 참조가 나타납니다.

+0

클래스 정의 헤더 파일이'#include '에 포함되어 있다면'#include "header.h"양식을 대신 사용해보십시오. 문제가되는 코드 (클래스 정의 및 오류를 유발하는 코드)의 샘플을 게시하지 않으면 문제가 무엇인지 확실하게 알 수 없습니다. – bta

+0

그럼 클래스를 정의하면 다음과 같습니다. 클래스 테스트 { public : int a *; 시험 (INT * a) } 클래스 테스트 { 시험 : 시험 (INT * a) {this-> A = a 및} 이전 I 정의 여기서 이들의 임의의 클래스 다음 } 및 사용 : 시험 t = 새로운 시험 (anIntPointer); 그러면 'test :: test (int *)'에 대한 정의되지 않은 참조를 얻습니다. –

+0

위의 편집을 보면 생성자 선언 다음에 세미콜론이없는 것으로 보입니다. 또한 'a'선언이 잘못되었습니다 - 별표는 변수 (int * a) 앞에 있어야합니다 –

답변

0

더 나은 대답을 원하면 클래스 (정의 + 구현) 중 하나의 코드를 제공해야합니다.

당신이 제공하는 최소한의 설명과 함께, 당신의 생성자는 구현이 없다고 생각합니다.

3

코드 샘플을 컴파일하는 경우에도 놀랄 것입니다. 따라서 다른 모든 컴파일 오류를 먼저 수정하는 것이 좋습니다. 다음은 도움이 될만한 짧은 코드 샘플입니다.

// Class declaration 
class test 
{ 
    private: 
     // Member variable - should be private. 
     int* a; 
    public: 
     // Constructor declaration. 
     test(int* a); 

     // Inline function definition. 
     int getA() 
     { 
      return *a; 
     } 
}; 

// Constructor declaration. 
test::test(int* a) 
{ 
    this->a=a; 
} 

int main() 
{ 
    int i = 7; 
    test t(&i); 
    i++; 

    // Should return 8. 
    return t.getA(); 
} 
1

코드가 없으면 말할 수 없지만 클래스 정의가 세미콜론으로 끝나야합니다.

이 작업을 수행 :

test.h

class Test { 
    public: 
     int a*; 
     Test(int *a); 
}; //Missing this semi colon might be your problem 

Test.cpp에

#include "test.h" 

Test::Test(int *a) 
{ 
    this->a = a; 
} 

int main() 
{ 
    int *anIntPointer; 
    Test t = new Test(anIntPointer);   
    return 0; 
} 
+0

내가 작성한 코드는 코드 자체가 아니라 내가 만나는 행동 유형의 예라고 여겨졌습니다! –

1

class test 내부의 생성자 정의합니다 (test::test() 기능) 포장하지 마십시오 블록. 그것은 효과적으로 동일한 이름을 가진 새로운 클래스를 정의하지만 그것은 헤더의 것과 다릅니다. 그것은 다음과 같이하십시오 :

// .h file 
class test { 
public: 
    int *a; 
    test(int* a) 
}; 

// .cpp file 
test::test(int* a) 
{ 
    this->a=a; 
} 
0

이 시도 :

foo.h

class test { 
public: 
    int a*; 
    test(int* a) 
}; 

foo는.CPP

test::test(int* a) 
    { 
     this->a=a; 
} 
0

내가 위에서 만든 주석을 제외하고 의미, 당신은 당신이 이렇게 test를 인스턴스화하고 있다는 상태 (I 전체 혈당에 약간 낮은 해요) :

test t =new test(anIntPointer); 

new 작업자가 객체가 아닌 객체 자체에 포인터를 반환 - 당신은 그것을 인스턴스화해야합니다

test *t = new test(anIntPointer); 

(다시 의미 체계로 돌아가서 C++ 클래스의 대문자는 대문자로 된 첫 번째 문자입니다.)

0

게시 된 클래스 정의가 구문 상 유효하지 않습니다. 올바른 등가는 다음과 같습니다.

class test { 
    public: 
     int *a; 
     test (int *a) : a(a) {} 
}; 

이 컴파일이 수행됩니까?