gpt4 book ai didi

c++ - 有没有办法自定义编译错误/警告消息?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:09 28 4
gpt4 key购买 nike

例如,如果我有这样一个类:

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() 进行约束,以便在使用该对象之前必须调用它,并在用户违反约束时引发错误?另一个问题是为已弃用的方法创建自定义警告消息。使用上面的代码,如果我类(class)的用户调用 Widget::paint(),我如何告诉他们使用 Widget::paintWidget() 而不是弃用 Widget::paint(),并告诉他们使用已弃用的那个的后果?谢谢。

最佳答案

问题的第 1 部分:

不,没有很好的方法来提供关于使用私有(private)方法的自定义消息。我要做的是确保您只有一个公共(public) API 转发到私有(private)实现。这可以通过一些疙瘩图案或创建外观来完成。

由于您没有指定某人获取 Widget 的方式,我目前假设是 Singleton。

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();
// ...
};

这样做的缺点是你将不得不写一些/很多转发代码。

问题的第 2 部分:

class Widget {
public:
void Init();
[[deprecated("use paintWidget instead")]] void Paint();
void PaintWidget(); // A new implementation of paint
...
private:
Widget();
...
}

请注意,如果您无法访问启用了 C++17 的现代编译器,您可能需要检查编译器的特定属性。

关于c++ - 有没有办法自定义编译错误/警告消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41661102/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com