2014-04-09 2 views
0

나는 다음과 같은 무언가가구성 객체는

#include "QuadMesh.h" 
#include "SpecialFuncs.h" 

class SEMPotential { 

public: 
StructureIpsim SI; 
QuadMesh mesh; 
SEMPotential(//args); 

}; 

SEMPotential::SEMPotential(//args) { 
// init structure in here, need to call functions from SpecialFuncs.h to do so 
// How to construct the QuadMesh object mesh? Can't put in initialization list. 
} 

당신은 볼 수 있듯이 QuadMesh 개체는 StructureIpsim 구조체를 사용하지만이 구조체는 전달되기 전에 SEMPotential 생성자의 여러 함수를 사용하여 초기화해야합니다. QuadMesh 생성자로 이 문제를 해결하는 표준 방법은 무엇입니까?

+0

구조체 초기화자를 통해'SEMPotential'의 생성자에서 제공 한 인수를 가진 구조체에 의해'StructureIpsim'이 올바르게 설정되도록하는 것이 좋습니다. –

+0

이것이 가능하지 않으면'mesh '건설은'std :: shared_ptr '을 사용함으로써 지연 될 것이며, 준비가 될 때까지 할당하지 않을 것입니다. –

+0

또 다른 옵션은'QuadMesh'가 아무 것도하지 않는 기본 생성자를 가질 수 있고, 준비가되면 그것을 설정하기 위해 호출하는 함수입니다. –

답변

1

CAN은 initializer-list를 사용합니다. 관련 매개 변수를 받아들이고 계산을 수행하고 QuadMesh 개체를 반환하는 개인 정적 멤버 함수 여야하는 도우미 함수를 사용합니다. 초기화 목록을 사용하여 해당 도우미의 반환 값에서 멤버를 초기화합니다.

매트 McNabb는 그의 주석에서 지적한대로
class SEMPotential 
{ 
    static QuadMesh mesh_creator(/* args */); 
public: 
    QuadMesh mesh; 
    SEMPotential(/* args */) : mesh(mesh_creator(args)) {} 
}; 

QuadMesh SEMPotential::mesh_creator(/*args*/) 
{ 
    StructureIpsum s; 
    // init structure in here, calling functions from SpecialFuncs.h to do so 
    return QuadMesh(s); 
} 

, 그 도우미 함수 StructureIpsum의 생성자 수 있습니다. 그러나 StructureIpsum 또는 QuadMesh 클래스 정의를 수정할 필요가없는 솔루션을 제시합니다.

당신이 StructureIpsum 인스턴스를 유지하려면, 메쉬를 초기화 초기화하는 도우미 메서드의 트릭을 사용하고 단순히 그것을 사용

회원의

초기화 순서가 보장

SEMPotential(/* args */) : SI(ipsum_creator(args)), mesh(SI) {} 
(이 순서입니다 그들은 클래스에 나타나면 초기화 목록의 순서는 아무 효과가 없습니다).

+0

멋지다. 정적 인 이유는 무엇입니까? – bcf

+0

@bcf : 도우미 함수는'SEMPotential'의 인스턴스가 존재하기 전에 호출되기 때문에 (여전히 생성 중입니다). –

+0

Gotcha. 빠른 수정을 가져 주셔서 감사합니다! – bcf