我想初始化从类B
派生的类A
,并在B
中我首先构造一个用于构造{的缓存{1}},例如,
A
这不会起作用,因为父对象class B: public A {
public:
B(): A(cache_), cache_(this->buildCache_())
protected:
const SomeDataType cache_;
private:
SomeDataType
buildCache_() const
{
// expensive cache construction
}
}
总是先被初始化(填充A
之前)。
(为了完整起见:cache_
在从cache_
派生的类中使用了很多次。)
作为替代方案,我可以做到
B
这样做的缺点是class B: public A {
public:
B(): A(this->buildCache_())
protected:
const SomeDataType cache_;
private:
SomeDataType
buildCache_()
{
// expensive cache construction
// fill this->cache_ explicitly
return cache_;
}
}
不能buildCache_()
。此外,海湾合作委员会抱怨
const
对此有更合适的解决方案吗?
答案 0 :(得分:4)
你正在做什么是未定义的行为,来自[class.base.init] / 14,强调我的:
可以为正在构建的对象调用成员函数(包括虚拟成员函数,10.3)。 类似地,正在构造的对象可以是
typeid
运算符(5.2.8)或dynamic_cast
(5.2.7)的操作数。但是,如果这些操作是在 ctor-initializer (或直接调用的函数)中执行的 或者在基类的所有 mem-initializer 完成之前,间接来自 ctor-initializer ,结果 操作未定义。
您要做的是使用Base-from-Member idiom:
class Cache {
protected:
const SomeDataType cache_;
};
class B : private Cache, public A {
public:
B() : Cache(), A(cache_)
{ }
};
答案 1 :(得分:1)
从C ++ 11开始,您可以使用正向构造函数:
string encodedString = HttpServerUtility.UrlEncode(yourString);