2014-04-09 79 views
0

我有类似如下:构建对象在另一个类变量初始化后

QuadMesh.h:

#include "StructureIpsim.h" // this is a struct 

class QuadMesh { 

public: 
QuadMesh(StructureIpsim s) {//do stuff} 

}; 

SEMPotential.h:

#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 sruct,但是在传递之前,必须使用SEMPotential的构造函数中的几个函数来初始化此结构到QuadMesh构造函数。这是什么标准的方法?

+0

一个好的设计是'StructureIpsim'通过它的构造函数正确设置(它的参数是通过构造函数初始化列表从'SEMPotential'的构造函数提供的) –

+0

如果这是不可能的,可以使'mesh通过使用'std :: shared_ptr '来延迟构建,而不是在你准备好之前你不分配它。 –

+0

另一种选择是'QuadMesh'有一个默认的构造函数,它什么都不做,并且你准备好了一个函数来在你准备好之后进行设置 –

回答

1

CAN使用初始值设定项列表。使用一个辅助函数,该函数可能应该是一个私有静态成员函数,它接受相关的参数,进行计算并返回一个QuadMesh对象。使用初始化列表从该助手的返回值初始化成员。

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的构造函数。但是我提出了一个不需要修改StructureIpsumQuadMesh类定义的解决方案。

如果您想保留StructureIpsum实例,使用辅助方法技巧进行初始化,然后简单地使用它来初始化网:

SEMPotential(/* args */) : SI(ipsum_creator(args)), mesh(SI) {} 
成员

初始化为了保证(这是他们的顺序出现在类中,初始化列表中的排序不起作用)。

+0

很酷,这似乎工作。为什么静态? – bcf

+0

@bcf:因为辅助函数在存在“SEMPotential”实例之前调用(它仍在创建中)。 –

+0

Gotcha。感谢您的快速解决! – bcf