我有一个摘要class AbstractClass
。我的所有派生类都应该有一些const std::vector
但是......这个字段与派生的class
(带有类型)相关联 - 而不是实例。所以把它作为static
可能会很棒。当然我不能在基类中定义它,我不能强迫在将来可以添加的每个派生类中实现它。
所以我希望定义新派生类的人将其实现为static
。 (如果没有,程序应该可行,但会有不必要的内存占用....)。
所以我有一个纯vitual
方法返回这个变量:
virtual const std::vector<SomeType>& getVec() const = 0;
我现有的派生类定义为:
class DerivedClass : public AbstractClass
{
public:
const std::vector<SomeType>& getVec() const { return vec; }
private:
static const std::vector<SomeType> Vec;
}
我尝试这样做是安全的,我想到其他程序员可能会添加新的派生类并可能以不同的方式实现它...... 例如:
const std::vector<SomeType>& getVec() const { return std::vector<SomeType>{ arg1, arg2}; }
我将返回的类型定义为const reference
,因为我想避免复制(如果Vec
是类的成员)...公开此方法是否安全?返回const reference
是否有任何危险?
答案 0 :(得分:3)
公开此方法是否安全?
是的,是的。
返回
const reference
是否存在危险?
不,没有。
如果其他开发人员以您展示的方式实现了界面,他们将在代码中以未定义的行为结束,迟早会失败。
没有任何语言功能阻止您使用您的界面并将其实现错误。
答案 1 :(得分:1)
您可以通过提供不同的继承接口来强制执行设计,CRTP实现所需的行为。您希望每个类都有std::vector
静态?您执行以下 1 :
class AbstractClass
{
template<typename>
friend class DerivedBase;
AbstractClass() = default;
public:
virtual const std::vector<SomeType>& getVec() const = 0;
};
template<typename CRTP>
class DerivedBase : AbstractClass
{
protected:
DerivedBase() = default;
static const std::vector<SomeType> vec;
public:
const std::vector<SomeType>& getVec() const { return vec; }
};
class DerivedClass : DerivedBase<DerivedClass>
{
};
现在每个DerivedClass
都是AbstractClass
,通过中间人强制执行此设计。并且由于CRTP,每个DerivedClass
自动获得自己的静态向量。
[1]我省略了与正确性相关的重要细节,例如虚拟析构函数,以保持代码简短。别忘了他们。
答案 2 :(得分:0)
如果您的会员功能的来电者遵守规则,那么完成此功能绝对没有危险public
。
他们会const_cast
向量并开始修改它的可能性也存在。如果您不信任您的用户,则需要切换到复制。