class BaseClass {
public:
  BaseClass(const byte *buff, long size) {
     // Some Computation
  }
};

class DerivedClass: public BaseClass {
public:
  std::vector<byte> filebuff;
  long buff_size;
  DerivedClass(): BaseClass(/*How should I send stuff here?*/)
  {
  }
  /*return type??*/  cal_func(){
   // Some computation involving file descriptors.
   // Store result in filebuff. Store size of filebuff in buff_size.
    return /*what??*/;
  }
}


我只能想到以下解决方案:

 DerivedClass(): BaseClass(&filebuff[0], cal_func)


在上述情况下,我将使函数func()返回filebuff的长度。我依赖的事实是filebuff只是一个地址,因此编译器是将计算的func值放在栈的第一还是第一个arg filebuff都没有关系。

请告诉我这是否是正确的方法。如果第一个参数不是地址和其他一些需要在函数func中执行的计算值,那么最好的方法是什么?

最佳答案

似乎您正在尝试包装其他人编写的类(例如在另一个库中),该类带有两个参数,而另一个类(您编写的)具有更清晰的接口。我对么?

您建议的解决方案是从另一个基类派生,然后使用派生类存储放在基类中的参数。上面方法的问题在于,当您调用基类构造函数时,派生类尚未完全构建(即,不能保证将filebuff和bufsize初始化为任何东西)。

我建议一种替代方法,您可以使用一个WrapperClass而不是派生类,该WrapperClass包含基类以及您拥有的两个数据成员,如下所示:

class Wrapper {
public:
  Base base;
  std::vector<byte> filebuff;
  long buff_size;
  Wrapper();
}


因此,在包装器类的构造函数中,您可以执行以下操作:

WrapperClass::WrapperClass() {
  //do whatever you want to initialize filebuff and buffsize here
  calcfunc();

  //now pass them in to your base class
  base = Base(filebuff, buffsize);
}


[编辑]

另类

上述解决方案假定您的基类具有默认构造函数,即Base()。可能不是,您不能创建一个。如果是这样,则上面的代码将无法编译,因为没有办法默认初始化base成员变量。一种替代方法是使用指向Base类的指针,例如Base*std::unique_ptr<Base>,或某种此类机制,而不是直接使用Base成员。这样,您可以精确地控制基类的初始化时间。所以:

//class definition
class Wrapper {
public:
  std::unique_ptr<Base> base;
  std::vector<byte> filebuff;
  long buff_size;
  Wrapper();
}

//...

//constructor implementation
WrapperClass::WrapperClass() {
  //do whatever you want to initialize filebuff and buffsize here
  calcfunc();

  //now pass them in to your base class
  base = new Base(filebuff, buffsize);
}

关于c++ - C++:如何调用具有多个参数的基类构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15712845/

10-14 05:22