2014-03-28 1 views
-3

클래스에서 객체 A을 생성했다고 가정 해 봅시다. Object A은 생성자에 대해 많은 인수를 취합니다.생성자에서 포인터를 할당하십시오. 무엇이 좋은 연습입니까?

오브젝트 BB'에서 A'의 인스턴스를 저장하고 싶습니다. 그러나 클래스 B'도 생성자에서 상당히 많은 인수를 원합니다. A'에 대한 모든 인수를 생성자에 전달하는 대신 먼저 A'의 인스턴스를 만든 다음 더 큰 인수를 생성하는 대신 B'의 생성자에 대한 참조를 보내야합니다.

class A' 
{ 
    A'(arg1, arg2,...argn); 


}A(arg1, arg2,...argn); 


class B' 
{ 
    public: 
    B'(arg1, arg2,...argn, A'* aptr) 
    A'* myA; 

}B(arg1, arg2,... argn, &A); 

이 좋은 코드 연습 : C에서

는 다음과 같이 보일 것 ++? 또한 내가 어떻게 생성자를 통해 포인터를 가장 잘 할당 할까? 나는 지금까지 이와 비슷한 것을 해왔다.

myConstructor(object* __pointerToAnotherObjectStoredInThisObject) 
{ 
     pointerToAnotherObjectStoredInThisObject =  __pointerToAnotherObjectStoredInThisObject; 

}; 

확실히 작동하지만 깔끔하고 좋은 연습 등인가?

+3

코드가 내 눈을 아프게합니다. – Danvil

+1

작은 따옴표가 실제로 클래스 이름의 일부입니까? –

+0

'C++ '클래스를'C'스타일 구조체로 쓰고 있습니까? 그리고 긴 변수 이름은 무엇입니까? – DumbCoder

답변

0

포인터를 생성자에 전달한 다음 필드에 할당하는 데주의하십시오. 신중하더라도 포인터가 가리키는 데이터가 아직 사용 중일 때 해제되지 않도록하는 것이 어려울 수 있습니다. 또한 메모리를 해제하는 것이 안전 할 때 해결하기가 어려울 수 있습니다.

개체가 포인터로 가리키는 데이터의 자체 복사본을 유지하거나 shared_ptr을 사용하는 것이 좋습니다.

+0

이에 대한 대답은 확실히 포인터를 사용하지 않는 것입니다. B의 생성자에 대한 많은 논점을 피하기 위해 여기에 갈 필요가 없습니다. – Ben

+0

OP만이 참조, 포인터 또는 사본이 실생활 코드에 더 적합한 지 여부를 알 수 있습니다. A가 거대하고 B가 오래 살지 않는다면 어떨까요? – japreiss

+0

그건 완전히 다른 상황입니다.나는 결코 포인터를 사용하지 않는다고 말하지 않았다. 나는 그가 우리에게 준 예제에서, 그는 그것을 사용해서는 안된다고 말했다. 특히 여러 가지 주장을 피하는 것이 아닙니다. 그가 실제로 포인터가 필요한지 아닌지에 관계없이 그의 질문과 아무런 관련이 없습니다. – Ben

2

일반적으로 포인터를 피할 수 있으면 객체에 포인터를 저장하고 싶지는 않습니다. 가능하면 참조를 저장하십시오. 그것은 개체를 복사 할 수 없도록 만듭니다. 따라서 종속성이 파손 된 후에도 두 번째 클래스를 계속 사용하지 않게됩니다.

또한, 포인터를 포함한 멤버 변수를 초기화하는 적절한 표기법이 ...

myConstructor (object __foo) : foo(__foo) { }

는 여기서 참조를 사용하는 부재로서 다른 클래스 저장 클래스 정말로 기본적인 예가있다.

// Let's suppose we're implementing an XML file handling class. 
// We decide to put the file handling operations in one class and 
// let the XML stuff wrap around that file class. 

class File { 
    // Implement file opening/writing here 
}; 


class XMLFile { 
    // Implement XML opening/writing nonsense here. 
    File & m_file; 

    XMLFile (File & f); 
}; 

XMLFile::XMLFile (File & f) : m_file(f) { 
} 
+0

위대한, 내 질문에 대답했습니다! – user3050215

관련 문제