2014-12-03 6 views
0

두 클래스가 있습니다. foobar입니다. foo의 생성자는 bar 클래스가 인스턴스화 할 수 있도록 private입니다. 또한클래스가 친구로 인식되지 않습니다.

// foo.h 
class foo 
{ 
    friend class bar; 
private: 
    foo() 
    {} 
}; 

// bar.h 
class bar 
{ 
public: 
    bar() 
    { 
    foo* f = new foo(); 
    } 
}; 

나는 내가 오류

In instantiation of ‘typename boost::detail::sp_if_not_array::type boost::make_shared() [with T = bar; typename boost::detail::sp_if_not_array::type = boost::shared_ptr]’:| /home/..../Projects/CodeBlocks/../bar.cpp|18|required from here| /home/..../Projects/CodeBlocks/../foo.h|23|error: ‘foo::foo()’ is private| ||=== Build finished: 1 errors, 2 warnings (0 minutes, 5 seconds) ===|

을 얻는 프로그램을 빌드하려고하지만 그러나 편의상 여기

그것을 언급하지 않았다 boost::shared_ptr을 사용하고 있기 때문에 bar.h 먼저 지어 질까? 그렇다면이 문제를 해결하는 방법에 대한 제안 사항이 있습니까?

+1

'bar'는'foo'의 친구 일 수 있지만'boost :: make_shared'는 아닙니다. 대신에'boost :: shared_ptr' 생성자를 직접 사용하십시오. – Praetorian

답변

3

I am using boost::shared_ptr however for simplicity I did not mention it here

역설적이게도 코드가 컴파일에 실패하는 바로 그 것입니다. 이를 사용하지 않으면 표시된 예제가 오류없이 컴파일됩니다.

boost::make_shared을 사용하여 shared_ptr을 만드는 중입니다. 그러면 make_sharedfoo을 만들려고하는데 이는 barfriendfoo이라고 선언했기 때문에 실패합니다. make_sharedfriend이 아니므로 물론 실패합니다.

대신 shared_ptr 생성자를 직접 사용하고 bar에 의해 할당 된 foo 개체에 대한 포인터를 전달하십시오. friendboost::make_shared로 선언하는 것은 신뢰할 수있는 솔루션이 아니라고

Live demo


참고 하나는 다른 함수의 실제 구성을 위임 할 수 있기 때문이다.

관련 문제