C++ 访问基类构造函数中的派生成员引用
假设我有一个类,它通过映射中的代理类存储对派生类成员变量的引用。此映射填充在一个名为C++ 访问基类构造函数中的派生成员引用,c++,crtp,C++,Crtp,假设我有一个类,它通过映射中的代理类存储对派生类成员变量的引用。此映射填充在一个名为foo()的函数中。它可能看起来像这样: #include <map> #include <memory> class property_base { }; template<typename T> class property : public property_base { public: property(T& propert
foo()
的函数中。它可能看起来像这样:
#include <map>
#include <memory>
class property_base
{
};
template<typename T>
class property : public property_base
{
public:
property(T& property) : property_(property)
{
}
private:
T& property_;
};
template<typename T>
class base
{
public:
base()
{
static_cast<T*>(this)->foo();
}
protected:
std::map<std::string, std::unique_ptr<property_base>> properties_;
};
class derived : public base<derived>
{
public:
void foo()
{
properties_.emplace("member", std::unique_ptr<property_base>(new property<int>(value_)));
}
private:
int value_;
};
#包括
#包括
类属性库
{
};
模板
类属性:公共属性\u基
{
公众:
属性(T&property):属性(property)
{
}
私人:
T&property;
};
模板
阶级基础
{
公众:
base()
{
静态_cast(this)->foo();
}
受保护的:
std::映射属性;
};
派生类:公共基
{
公众:
void foo()
{
属性放置(“成员”,std::unique_ptr(新属性(值));
}
私人:
int值;
};
我知道这被认为不是一个好模式,因为我做了一件坏事——在运行派生类成员变量的构造函数之前访问它们,但我只存储引用,只要我不把它弄糟并开始用它们做任何其他事情,这应该是好的。也就是说,有没有我忽略的情况/场景,调用只在映射中存储引用的
foo()
会导致任何错误?如果base
有一个受保护的构造函数使用类似于std::initializer\u list
的东西,那么这段代码就会容易得多。“它在映射中存储对派生类成员变量的引用“-你不能在地图中存储引用。@ChristianHackl fair point,没想到:)@François Andrieux-我能读代码。非常感谢。我的观点是在术语和描述事物的方式上要精确。地图包含unique\u ptr
s,而不是参考。这么说吧。你不在派生的
类构造函数中添加属性有什么原因吗?如果base
有一个受保护的构造函数,它采用类似于std::initializer\u list
“在映射中存储对派生类成员变量的引用”,那么这段代码就会容易得多-你不能在地图中存储引用。@ChristianHackl fair point,没想到:)@François Andrieux-我能读代码。非常感谢。我的观点是在术语和描述事物的方式上要精确。地图包含unique\u ptr
s,而不是参考。这么说吧。你为什么不在派生的
类构造函数中添加属性?