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

时间:2014-08-10 15:47:36

标签: c++ constructor initialization

我问的问题多次出现,但对我来说不够具体。在我的例子中,我有一个类(让我们调用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级的任何内容

4 个答案:

答案 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)

您可以为C1which 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;
};