天天看点

C++类中在构造器中调用本类的另外构造器

一个类中,构造器有多个,参数有所差异,而执行内容由相似.这个时候,当然是在一个构造器中调用另外一个构造器.在JAVA中通过this可以很容易的实现.在C++中,必须使用特殊方式.

在构造器中调用通用的init()成员函数.这样的好处是外部也可以显式初始化.

正确办法

编译时要加参数:g++ -std=c++11

template <class TYPE>
SafeArray<TYPE>::SafeArray(const int size) : SafeArray<TYPE>(size, __FILE__, __FUNCTION__, __LINE__)
{
    //
}
 
template <class TYPE>
SafeArray<TYPE>::SafeArray(const int size, const char* pFile, const char* pFunction, const int nLine)
{
    ....
}      
  • 疑问方法

  以下编译成so时可以通过,单独编译时出错.

template <class TYPE>
SafeArray<TYPE>::SafeArray(const int size)
{
    new (this)SafeArray<TYPE>(m_nSize, __FILE__, __FUNCTION__, __LINE__);
}
 
template <class TYPE>
SafeArray<TYPE>::SafeArray(const int size, const char* pFile, const char* pFunction, const int nLine)
{
    ......
}      

转帖一点内容:

  这种技术名字叫placement new,与一般的operator new不一样。

  new (pointer)构造函数() 里面,看括号里面的是一个指针整句话的意思就是生成一个对象,然后将对象放在指针指向的地址那里。这种方法可以在任意地方构造对象。