类成员是需要构造函数的对象.它需要一个函数来实例化

C++ Class member is an object that requires a constructor... which requires a function to instantiate

本文关键字:一个 函数 实例化 成员 构造函数 对象      更新时间:2023-10-16

我问的问题出现了很多次,但对我来说不够具体。在我的例子中,我有一个类(我们叫它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);
}

我已经看到了这里的初始化列表,但我唯一的想法是如何做它会导致一个非常丑陋的初始化列表,就像这样:(这工作)

class C0{
public:
  C0() : variable1(doSomething1), variable2(doAnotherThing), variable3(keepItWorking), data(finallyDoSomethingWithTheOtherVariables), c1(data)
{
  //Something
};
class C1{
//Stuff
};

是否有一种优雅的方式来实现我的愿望?

更新哦,对了,我忘了说:我不能更改class C1

中的任何内容

如果我理解正确的话,看起来您想做一些处理,然后使用初始化列表初始化您的类成员。

可以使用静态成员来实现这一点,如下所示:

class C0{
public:
  C0():  myC1(process()){
    //Do some process with data
   }
private:
  C1 myC1;
    static ComplexDataType process()
    {
        ComplexDataType data;
        // ... do stuff
        return data ;
    }
};

我看到了几个解决这个问题的方法

可以在C0中保存指向myC1的指针。然后在C0的c'tor中,你可以处理你的数据,然后设置myC1 = new myC1(data);

class C0 {
public:
  C0() {
    ComplexDataType data;
    //Do some process with data
    myC1 = new C1(data);
  }
private:
  C1 *myC1;
};

或者,如果有意义的话,您可以添加一个新类,它将在其c'tor中完成初步工作,并在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;
};

您可以为C1实现复制赋值运算符(无论如何您可能应该这样做),并且在C0构造函数中只需执行例如myC1 = C1(data);

我猜你不能修改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;
};