【问题标题】:throw assignment operator抛出赋值运算符
【发布时间】:2019-04-14 04:32:36
【问题描述】:

C++

当有人调用赋值运算符时我如何抛出错误?

我有一个使用工厂方法而不是构造函数的基类。工厂方法读取文件并根据文件内容调用派生类构造函数。

Base *a::create(file1);
Base *b::create(file2);

如果有人调用赋值运算符,我想抛出一个错误。

*a = *b; // filetype contents don't match

在执行上面的那一刻,我的*a的内容被*b覆盖了。我假设它调用了隐式赋值运算符,这是我不希望发生的。

当我将赋值运算符声明为私有时。在单独的测试文件中运行时出现以下错误。

test.cc:34:13: fatal error: 'operator=' is a private member of 'Test'
    *aa = *ad;
    ~~~ ^ ~~~
./Base.h:14:16: note: declared private here
    Base& operator=(const Base &rhs);
           ^
1 error generated.
make: *** [test] Error 1

我希望它宁愿抛出错误而不是上面显示的内容。比如“你不能这样做”之类的。

任何帮助将不胜感激。

【问题讨论】:

  • 您是否尝试过将其公开并使用throw
  • I would like it to rather throw an error instead of what is shown above. Like "you can't do this" or something. 这不正是您现在得到的吗?编译器告诉你You can't do this。或者你可以= delete这个函数,错误会不同,结果会一样。
  • 我被告知它必须显示错误消息并且赋值运算符不能公开。
  • 确实显示错误消息。你有什么问题?
  • 我因为没有抛出错误而被扣分。它显示了上面显示的内容。我应该抛出一个错误,方法不能公开。

标签: c++ assignment-operator


【解决方案1】:

编译时错误比运行时错误好(因为它们阻止开发人员认为他们的代码实际上没有机会工作)。正确的做法是将不可用的运算符和构造函数声明为私有或受保护的,这样它们就不能被 friends 使用(例如工厂)。

【讨论】:

  • 现代 C++ 中的赋值运算符不能删除吗?
  • @JonathanLeffler:当然,您可以= delete 运算符,在这种情况下,它们是否为public 并不重要。好点,假设工厂不需要这些功能。
猜你喜欢
  • 2011-08-02
  • 2019-10-06
  • 2011-11-16
  • 2013-11-30
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-29
  • 2011-07-29
相关资源
最近更新 更多