我问的问题多次出现,但对我来说不够具体。在我的例子中,我有一个类(让我们调用C0),它有一个成员,它是一个需要构造函数的类(调用这个C1)。但是,在我的情况下,我想在将变量传递给C1的构造函数之前进行一些处理。有没有办法做到这一点?从本质上讲,我想实现这样的目标:(当然这不起作用)
class C0{
public:
C0(){
ComplexDataType data;
//Do some process with data
myC1(data);
}
private:
C1 myC1;
};
class C1{
public:
C1(ComplexDataType data);
}
我已经看到了here的初始化列表,但是我唯一想过如何做的会导致一个非常丑陋的初始化列表,如下所示:(有效)
class C0{
public:
C0() : variable1(doSomething1), variable2(doAnotherThing), variable3(keepItWorking), data(finallyDoSomethingWithTheOtherVariables), c1(data)
{
//Something
};
class C1{
//Stuff
};
有没有一种优雅的方式来实现我的愿望?
更新 哦,是的,我忘了提到:我无法改变C1级的任何内容
答案 0 :(得分:2)
我认为有几种方法可以解决这个问题。
您可以在C0中按住指向myC1的指针。 然后在C0的内部,您可以处理您的数据,然后设置myC1 = new myC1(数据);
class C0 {
public:
C0() {
ComplexDataType data;
//Do some process with data
myC1 = new C1(data);
}
private:
C1 *myC1;
};
或者,如果有意义的话,你可以添加一个新的类,它将在它的c中执行初步工作并在C0中的myC1之前声明它(并因此创建它),然后传递它的结果(使用get方法)在创建时到myC1。
class DataConfiguration {
public:
DataConfiguration() {
//Do some process with data
}
const ComplexDataType &getData() {
return data;
}
private:
ComplexDataType data;
};
class C0 {
public:
C0() :
dataConf(),
myC1(dataConf.getData()) {
}
private:
DataConfiguration dataConf;
C1 myC1;
};
答案 1 :(得分:2)
如果我理解正确,看起来你想做一些处理,然后使用初始化列表初始化你的类成员。
您可以使用静态成员实现此目的,如下所示:
class C0{
public:
C0(): myC1(process()){
//Do some process with data
}
private:
C1 myC1;
static ComplexDataType process()
{
ComplexDataType data;
// ... do stuff
return data ;
}
};
答案 2 :(得分:1)
您可以为C1
(which you probably should to anyway)实现一个副本分配运算符,并在C0
构造函数中执行以下操作: myC1 = C1(data);
。
答案 3 :(得分:1)
我猜你不能修改C1
类,所以你应该认真考虑使用指针。一旦你不再需要这个对象,你甚至可以使用shared_ptr
来忘记释放内存。
class C0{
public:
C0(){
ComplexDataType data;
//Do some process with data
myC1 = std::make_shared<C1>(data);
}
private:
std::shared_ptr<C1> myC1;
};