例如,如果我有这样的类:
class Widget {
public:
virtual void Init(); // In this function, call some virtual function
// to construct the object
void Paint(); // Deprecated, use paintWidget instead
void PaintWidget(); // A new implementation of paint
... // Other stuff, including a virtual function
// which need to be called to construct the object
}
构造Widget
需要一个虚函数调用(这就是我编写Widget::Init()
的原因)。有没有办法对Widget::Init()
进行约束,以便在使用对象之前必须调用它,如果用户违反约束则会引发错误?另一个问题是为不推荐使用的方法创建自定义警告消息。使用上面的代码,如果我的班级用户调用Widget::paint()
,我怎么能告诉他们使用Widget::paintWidget()
而不是弃用Widget::paint()
,并告诉他们使用弃用的<div rel="tooltip" title="I workz" class="wrap">
<div class="overlap"></div>
<button>I workz</button>
</div>
<div rel="tooltip" title="Boo!!" class="wrap poptooltip">
<div class="overlap"></div>
<button disabled>I workz disabled</button>
</div>
.wrap {
display: inline-block;
position: relative;
}
.overlap {
display: none
}
.poptooltip .overlap {
display: block;
position: absolute;
height: 100%;
width: 100%;
z-index: 1000;
}
的后果?谢谢。
答案 0 :(得分:2)
不,没有使用私有方法提供自定义消息的好方法。我要做的是确保您只有一个公共API转发到私有实现。这可以通过一些疙瘩模式或通过创建一个立面来完成。
由于你没有指定某人获取Widget的方式,我现在正在假设一个单身人士。
class Widget {
public:
Widget() : _impl(getHoldOfPrivateWidgetViaSingleton())
{
_impl.init();
}
// ...
private:
PrivateWidget &_impl;
};
// Note: rename of the Widget in your example
class PrivateWidget {
private:
friend class Widget;
PrivateWidget();
// ...
};
这样做的缺点是你必须编写一些/大量的转发代码。
class Widget {
public:
void Init();
[[deprecated("use paintWidget instead")]] void Paint();
void PaintWidget(); // A new implementation of paint
...
private:
Widget();
...
}
请注意,如果您无法访问启用了C ++ 17的现代编译器,则可能需要查看编译器特定的属性。
答案 1 :(得分:1)
您可以使用 #warning 指令,大多数广泛使用的编译器(GCC,VC,Intels和Mac)都支持#warning消息。
#warning "this is deprecated, use the Init() method instead"
一个好的方法是不仅要显示一个警告(人们可以忽略),而是使用#error指令(非常标准)使编译失败:
# error "this method is forbidden and private"
作为特定于Visual Studio的solution,您可以使用 pragma 。