C++ 即使我重载=运算符,也无法生成赋值运算符
我的类是多态性的,无论如何都不应该被用作class='d。它有一个Font类型的成员&因此编译器无法生成=运算符。所以我只是创建了赋值和复制构造函数的虚拟实现,将它们放在类的私有中,但它仍然警告我赋值运算符无法生成。我还能怎样摆脱这个警告呢 谢谢C++ 即使我重载=运算符,也无法生成赋值运算符,c++,visual-studio-2008,warnings,C++,Visual Studio 2008,Warnings,我的类是多态性的,无论如何都不应该被用作class='d。它有一个Font类型的成员&因此编译器无法生成=运算符。所以我只是创建了赋值和复制构造函数的虚拟实现,将它们放在类的私有中,但它仍然警告我赋值运算符无法生成。我还能怎样摆脱这个警告呢 谢谢 警告9警告C4512:“AguiWidget”:无法生成赋值运算符c:\users\josh\documents\visual studio 2008\projects\agui\Allege\u 5\agui\AguiWidget.hpp 250您可
警告9警告C4512:“AguiWidget”:无法生成赋值运算符c:\users\josh\documents\visual studio 2008\projects\agui\Allege\u 5\agui\AguiWidget.hpp 250您可以禁用它。当然,如果你真的想使用这些操作符,这是行不通的 你确定你的签名是对的吗?您为每个类、基本类和派生类制作了它们吗?使用 注: 所有子类也将强制使用noncopyable 编辑: 哇。。。那是一门可怕的课 使用可减少代码的相互依赖性并提高接口的可读性
此外,还应尽量避免使用受保护的成员变量,因为它会破坏封装。编译器警告您的赋值运算符是针对您自己的类的赋值运算符。您现在拥有的是:
AguiWidget& operator=(const AguiFont &tmp);
您需要的是:
AguiWidget& operator=(const AguiWidget &tmp);
请发一些密码。(bis repetitas)好吧,代码太多了,你能告诉我们它到底在抱怨哪一行吗?你不应该删除整个代码,只需发布相关部分即可你必须为每种类型都做吗?是的。这实际上是一个愚蠢而无用的警告;除非你真的尝试使用这些操作符,否则这无关紧要,它会阻塞很多有用的构造(boost会导致它吐出十亿个)。您应该考虑全局禁用它。您还应该声明它是私有的——这使得任何试图使用复制赋值操作符的编译时错误(相对于链接时间)。@ TabBi33:它已经是私有的。OP刚才删除了他的代码。@Tabber33:哦,对不起。OP在他的问题中提到了“把它们放在班级的私人空间”,所以我相信是这样的没有必要为了这么简单的事情而将Boost拖到这里(除非他已经在使用Boost)。OP所要做的就是修改赋值运算符,使其接受类型为
AguiWidget
的参数,而不是AguiFont
。这是一门可怕的课程。但是,如果他不使用boost,那么他应该创建自己的“不可复制”类,因为它提高了可读性并清楚地显示了意图。@Praetorian您还打算如何创建一个包含近30个事件回调的widget类,GuiChan的widget类也相当大。@ronag该类是抽象的anyways@ronagAguiWidget的派生类如何在不受保护的情况下重写?
AguiWidget& operator=(const AguiWidget &tmp);