【发布时间】:2018-03-31 09:37:19
【问题描述】:
我正在查看book 中的包装类示例。包装类本身显示在本文的末尾。
在本书的第 94 页有一个继承类的示例。我对构造函数的初始化列表中发生了什么有疑问:
class RandomBase
{
public:
RandomBase(unsigned long Dimensionality);
virtual RandomBase *clone() const = 0;
virtual ~RandomBase(){};
private:
unsigned long Dimensionality;
};
class AntiThetic : public RandomBase
{
public:
AntiThetic(const Wrapper<RandomBase> &innerGenerator) : RandomBase(*innerGenerator),
InnerGenerator(innerGenerator) {}
virtual RandomBase *clone() const
{
return new AntiThetic(*this);
}
private:
Wrapper<RandomBase> InnerGenerator;
};
首先,我无法编译它。我收到错误:error: invalid conversion from ‘const RandomBase*’ to ‘long unsigned int’ [-fpermissive]。其次,当我们调用 RandomBase(*innerGenerator) 时,我从概念上不明白发生了什么——我不知道用 C++ 可以做到这一点(?)
这里是包装类Wrapper:
#ifndef WRAPPER_H
#define WRAPPER_H
template< class T>
class Wrapper
{
public:
Wrapper()
{ DataPtr =0;}
Wrapper(const T& inner)
{
DataPtr = inner.clone();
}
~Wrapper()
{
if (DataPtr !=0)
delete DataPtr;
}
Wrapper(const Wrapper<T>& original)
{
if (original.DataPtr !=0)
DataPtr = original.DataPtr->clone();
else
DataPtr=0;
}
Wrapper& operator=(const Wrapper<T>& original)
{
if (this != &original)
{
if (DataPtr!=0)
delete DataPtr;
DataPtr = (original.DataPtr !=0) ? original.DataPtr->clone() : 0;
}
return *this;
}
T& operator*()
{
return *DataPtr;
}
const T& operator*() const
{
return *DataPtr;
}
const T* const operator->() const
{
return DataPtr;
}
T* operator->()
{
return DataPtr;
}
private:
T* DataPtr;
};
#endif
包装取自here
【问题讨论】:
-
Wrapper解引用运算符返回一个指针,这没有多大意义。也许它应该返回一个引用? -
@某程序员老兄:即便如此,它也不应该转换为构造函数要求的 unsigned long。
-
说的差不多。
-
父类还能如何初始化自己?与析构函数不同,构造函数调用不会自动调用继承层次结构。