初始化变量后在另一个类中构造对象

Construct object in another class after initializing variables

本文关键字:对象 另一个 变量 初始化      更新时间:2023-10-16

我有如下内容:

QuadMesh.h:

#include "StructureIpsim.h"  // this is a struct
class QuadMesh {
public:
QuadMesh(StructureIpsim s) {//do stuff}
};

SEMPpotential.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结构,但在将该结构传递给QuadMesh构造函数之前,必须使用SEMPotential构造函数中的几个函数对其进行初始化。解决这个问题的标准方法是什么?

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);
}

正如Matt McNabb在他的评论中指出的那样,辅助函数可以StructureIpsum的构造函数。但我提出了一个不需要修改StructureIpsumQuadMesh类定义的解决方案。

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

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

成员的初始化顺序是有保证的(这是它们在类中出现的顺序,初始化列表中的顺序没有影响)。

相关文章: