【问题标题】:Assignment operator could not be generated even when I overload the = operator即使重载 = 运算符也无法生成赋值运算符
【发布时间】:2011-05-15 06:46:50
【问题描述】:

我的类是多态的,无论如何都不应该被用作 ='d。它有一个 Font& 类型的成员,因此编译器无法生成 = 运算符。所以我只是创建了赋值和复制构造函数的虚拟实现,将它们放在类的私有中,但它仍然警告我无法生成赋值运算符。我还能如何摆脱这个警告?

谢谢

警告 9 警告 C4512: 'AguiWidget' : 无法生成赋值运算符 c:\users\josh\documents\visual studio 2008\projects\agui\alleg_5\agui\aguiwidget.hpp 250

【问题讨论】:

  • 请发布一些代码。 (二重奏)
  • 好的,代码很多,你能告诉我们它实际上在抱怨哪一行吗?
  • 您不应该删除整个代码,只需发布​​相关部分即可。 :)

标签: c++ visual-studio-2008 warnings


【解决方案1】:

编译器警告您的赋值运算符是您自己的类的赋值运算符。你现在拥有的是:

AguiWidget& operator=(const AguiFont &tmp);

你需要的是:

AguiWidget& operator=(const AguiWidget &tmp);

【讨论】:

  • 您还应该将其声明为私有 - 这会使任何尝试使用复制赋值运算符的行为成为编译时错误(与链接时相反)。
  • @Tabber33:它已经是私有的了。 OP 刚刚删除了他的代码。
  • @Tabber33:糟糕,抱歉。 OP在他的问题中提到“将它们放在课堂上”,所以我相信如此。 :)
【解决方案2】:

您可以禁用它。当然,如果您实际上是在尝试使用这些运算符,这将不起作用。

您确定您的签名正确吗?您是否为每个类、基类和派生类都制作了它们?

【讨论】:

  • 你必须为每种类型制作它?
  • 是的。这实际上是一个非常愚蠢和无用的警告;除非您实际上尝试使用这些运算符,否则这无关紧要,并且它会阻止许多有用的构造(boost 会导致它吐出十亿个)。您应该考虑全局禁用它。
【解决方案3】:

使用boost::noncopyable

class AGUI_CORE_DECLSPEC AguiWidget : private boost::noncopyable

注意:

boost::noncopyable 也将对所有子类强制执行。

编辑:

哇...这是一个可怕的课程...

使用pimpl idiom 减少代码相互依赖性并提高界面可读性。

此外,您应该尽量避免受保护的成员变量(尽可能),因为它会破坏封装。

【讨论】:

  • 没有必要为了这么简单的事情把 Boost 拖进去(除非他已经在使用 Boost)。 OP 所要做的就是修复他的赋值运算符以接受AguiWidget 类型的参数,而不是AguiFont。这是一个可怕的课程:-D
  • 确实如此。但是,如果他不使用 boost,那么他应该创建自己的“不可复制”类,因为它提高了可读性并清楚地表明了意图。
  • @Praetorian 你怎么会建议创建一个带有近 30 个事件回调的小部件类,GuiChan 的小部件类也很大。
  • @ronag 这个类无论如何都是抽象的
  • @ronag AguiWidget 的派生类如何在不受保护的情况下覆盖?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-08
  • 2013-03-30
  • 2013-02-14
  • 2016-08-30
  • 1970-01-01
相关资源
最近更新 更多