我有一个UDPSocketTest类,它是从SocketTest派生的。 SocketTest在其构造函数中需要一个参数。

因为使用了gtest框架,所以UDPSocketTest需要有一个不带参数的构造函数,因此我想在UDPSocketTest的构造函数中创建它,并将其传递给SocketTest

问题是基类在成员之前由C++标准初始化。

class UDPSocketTest : public SocketTest
{
public:
   UDPSocketTest()
      socketPool_(new SocketPool()),  <<---- Line 1
      SocketTest(socketPool_) {       <<---- Line 2
   }

   ~UDPSocketTest() {
   }

private:
   SocketPool* socketPool_;
};

但是第2行应该在第1行之前调用。那么有什么方法可以实现呢?

最佳答案

使用委托(delegate)的构造函数(C++ 11):

class UDPSocketTest : public SocketTest
{
public:
   UDPSocketTest() : UDPSocketTest(new SocketPool()) {}

   // You should already have this constructor written:
   UDPSocketTest(SockerPool *p)
      SocketTest(p),
      socketPool_(p)
   {
   }

   ~UDPSocketTest() {
   }

private:
   SocketPool* socketPool_;
};

这是阻力最小的途径。在C++ 11之前,您必须将socketPool_移入从第一个继承的基类,因此它将是初始化顺序中的第一个基类。

10-07 20:42