一个类中,构造器有多个,参数有所差异,而执行内容由相似.这个时候,当然是在一个构造器中调用另外一个构造器.在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)构造函数() 里面,看括号里面的是一个指针整句话的意思就是生成一个对象,然后将对象放在指针指向的地址那里。这种方法可以在任意地方构造对象。