2011-02-07 2 views
2
#include <iostream> 
#include <cstring> 
using namespace std; 

class Obj; 


class Test { 
    friend class Obj; 
public: 
    Test() 
    { 

    } 
    ~Test() 
    { 

    } 
    void foo() 
    { 
     //print(); 
      //Obj::print(); 
      //Obj x; 
      //x.print(); 
    } 
}; 

class Obj { 
public: 
    void print() 
    { 
     cout << "print here" << endl; 
    } 
}; 

int main() 
{ 
    Test test; 
    test.foo(); 
    return 0; 
} 

빠른 질문, 어떻게 Test :: foo()에서 올바른 방법으로 인쇄 할 수 있습니까?C++ forward 선언

+1

여기서는 우정이 필요하지 않습니다. 한 가지 경우, 어느 쪽의 수업에도 개인 회원이 없습니다. –

답변

5

당신은 Obj의 후 정의를 멤버 함수 를 정의 할 필요가 : 제임스에 의해 언급 한 바와 같이

class Test { 
public: 
    void foo(); 
}; 

class Obj { 
public: 
    void print() { } 
}; 

void Test::foo() { 
    Obj o; 
    o.print(); 
} 
+0

감사합니다 제임스, 그 지금 일하고. – Kobe

2

당신이 확대 개체의 정의 후 멤버 함수를 정의해야합니다. 또한 Obj :: print를 호출하지만 인쇄는 정적 멤버 함수가 아니므로 Obj 자체가 아닌 Obj 인스턴스에서 호출해야합니다.

인쇄를 정적 구성원으로 지정하려면 실제로 선언하십시오.

class Obj { 
public: 
    static void print(){ blah } 
} 

또한 공개 메서드에 액세스하려면 친구를 만들 필요가 없습니다.

OP도 "올바른 방법"을 정의 할 수 있습니다. 정적 멤버 함수를 원한다고 가정 할 때 james의 대답은 올바른지, 예를 들어 Test 인스턴스 당 하나의 Obj 인스턴스가 필요합니다.

업데이트 됨 OP, 귀하의 의견에 따라 Obj 선언과 함께 테스트 내에서 사용하기 전에 인쇄본이 있어야합니다. 이것은 여러 가지 방법으로 달성 될 수있다 :

  • 이동 전체 클래스를 Obj (고화질) (그리고 선언) 시험 전에
  • 는 클래스 정의로 확대 개체의 메소드를 선언하고 나중에 정의합니다.
  • 당신이 가지고있는 것과 같이 Test를 정의하고 제임스의 포스트 (Obj 이후)로 테스트를 정의하십시오.

다음 잘 작동합니다 :

#include <iostream> 
#include <cstring> 
using namespace std; 

class Obj { 
public: 
    static void print() 
    { 
     cout << "print here" << endl; 
    } 
}; 

class Test { 
public: 
    Test() 
    { 

    } 
    ~Test() 
    { 

    } 
    void foo() 
    { 
      Obj::print(); 
    } 
}; 

int main() 
{ 
    Test test; 
    test.foo(); 
    return 0; 
} 

그것을 제외한 모든 사건의 가장 사소한에 대한 정의에서 선언을 분리 (제 생각에) 항상 좋네요 그러나.

+0

나는 모든 선택을 시도했기 때문에 거기에 정적 인 방법을 넣었습니다. 비록 그것이 작동할만한 것이었지만, 이제는 더 이상 할 수없는 일이 무엇인지 알았지 만 이제는 모두 좋은 덕택입니다. – Kobe

+0

예, 맞습니다. 해결책을 가져 주셔서 감사합니다. – Kobe