2012-01-06 2 views
1

클래스를 정의하려는 네임 스페이스가 있습니다. 클래스는 다소 복잡하기 때문에 별도의 헤더 파일에 정의하고 싶지만 가장 간단한 코드조차도 나에게 "정의되지 않은 참조"오류를줍니다.네임 스페이스 내에서 별도의 헤더에 정의 된 클래스를 사용하는 방법

MAIN.CPP

#include <iostream> 
namespace A { 
    #include "C.hpp" 
} 

int main() 
{ 
    A::C foo; 
    std::cout << foo.member << std::endl; 
    return 0; 
} 

C.hpp

class C { 
    public: 
    C(); 
    int member; 
} 

C.cpp

C::C() 
{ 
    this->member = 10; 
} 

내가 g++ C.cpp main.cpp를 실행하면 내가 얻을 "MAIN.CPP :(. 텍스트 + 0x10을) :`A :: C :: C() '에 대한 참조가 정의되지 않았습니다. C# :: C()라는 생성자의 정의가 어딘지 잘못되었다고 가정합니다.하지만이를 수정하는 방법은 확실하지 않습니다.

+1

잘 정의가 잘못된 것입니다 ... –

+1

이름 충돌이 발생하기 때문에이 작업을 수행했다고 가정합니다. 이 시점에서 간단히 말하면, "클래스를 만들 때 네임 스페이스를 무시하는 것에 대한 교훈을 얻었 으면합니다. –

답변

0
namespace A { 
    #include "C.hpp" 
} 

이 할 수있는 매우 이상한 일이다.

이것은 헤더에 선언 된 모든 것을 A이라는 네임 스페이스 안에 넣습니다. 구체적으로는 A::C이라는 선언을 제공합니다.이 클래스는 주변 네임 스페이스없이 헤더를 포함 할 때 얻을 수있는 ::C 클래스와 다릅니다.

::C::C()에 대한 정의를 제공했습니다. 그러나 main.cppA::C::C()에 대한 정의가 필요합니다. 이는 해당 클래스가 사용하는 클래스이기 때문입니다. 그것은 어디에도 정의되어 있지 않으므로 오류입니다.

어느 헤더 파일에 네임 스페이스를 이동하여 namespace A에 제대로 C를 넣어 (그 네임 스페이스를 사용하는 C.cpp 수정) 또는 namespace A 제거하기.

4

당신은 너무 네임 스페이스 A 내부 C의 생성자를 정의 할 수 있습니다

namespace A 
{ 
    C::C() 
    { 
     this->member = 10; 
    } 
} 
+4

따라서 클래스가 속한 네임 스페이스를 결정해야합니다. 네임 스페이스 A { #include "C.hpp"}'하나의 사용자와'namespace B {#include "C.hpp"}'다른 클래스에서 클래스와 그 멤버가 헤더에 전부 정의되어 있지 않다면, 두 사용자가 동일한 정의를 갖는 두 개의 서로 다른 클래스로 끝날 것이기 때문에 클래스 작성자가 선택한 네임 스페이스를 사용자가 싫어하면 네임 스페이스 A {typedef HorridNamespace :: CC;} 또는 ' 네임 스페이스 A {HorridNamespace :: C;} 사용. –

+0

헤더에 전체 클래스를 정의하거나 네임 스페이스 외부에 포함시켜야합니까? 클래스가별로 없을 경우 더 나은 접근 방법으로 간주됩니다. 네임 스페이스 바깥에서 사용 하시겠습니까? – user1134621

+0

@ 스티브 : 또는 간단히'네임 스페이스 A = HorridNamespace'입니다. –

관련 문제