我有一个由嵌套STL容器组成的数据结构:
typedef std::map<Solver::EnumValue, double> SmValueProb;
typedef std::map<Solver::VariableReference, Solver::EnumValue> SmGuard;
typedef std::map<SmGuard, SmValueProb> SmTransitions;
typedef std::map<Solver::EnumValue, SmTransitions> SmMachine;
Run Code Online (Sandbox Code Playgroud)
这种形式的数据仅在我的程序中短暂使用,除了简单地存储数据之外,附加到这些类型的行为并不多.但是,编译器(VC++ 2010)抱怨结果名称太长.
将类型重新定义为STL容器的子类而无需进一步详细说明似乎有效:
typedef std::map<Solver::EnumValue, double> SmValueProb;
class SmGuard : public std::map<Solver::VariableReference, Solver::EnumValue> { };
class SmTransitions : public std::map<SmGuard, SmValueProb> { };
class SmMachine : public std::map<Solver::EnumValue, SmTransitions> { };
Run Code Online (Sandbox Code Playgroud)
认识到STL容器不打算用作基类,在这种情况下是否存在任何危险?
Mat*_* M. 11
有一个危险:如果调用delete指向没有virtual析构函数的基类的指针,则会出现未定义的行为.否则,你很好.
至少那是理论.实际上,在MSVC ABI或Itanium ABI(gcc,Clang,icc,...)delete基类上没有虚拟析构函数(-Wdelete-non-virtual-dtor使用gcc和clang,提供类具有虚方法)只会导致问题,如果你的派生类使用非平凡的析构函数添加非静态属性(例如a std::string).
在你的具体情况下,这似乎很好......但......
...您可能仍希望封装(使用Composition)并公开有意义的(面向业务的)方法.它不仅危害性更小,而且比it->second.find('x')->begin()... 更容易理解