所以我一直在创建这个“框架”的东西,基本上把源代码放在一起(用于着色器)。当我提出创建一个语句类并重载所有操作符(完全改变它们的含义)以自然形式形成其他语句时,我认为我非常聪明。它看起来像这样:
class Statement {
public:
Statement operator=(const Statement &other) const;
Statement operator+(const Statement &other) const;
...
}
然而,当我认为我已经完成时,结果是操作符=完全忽略了返回值,而只是总是在'='之前返回对象。我是否理解正确无法完成此任务?
编辑:好的,对不起,我提供的示例编译(我的操作符也在A中重载,但也无效)。
编辑2:operator =实际上是const的目的:其意图是创建一个新的赋值语句对象。
示例:
Block b; // Represents a sequence of commands.
Statement var1, var2; // Represent some variables.
...
b.append(var1 = var2);
预期:b包含命令var1 = var2;
观察:b包括var1;
已解决:问题是因为我使用的是派生类而不是使用其默认运算符=的Statement。谢谢大家。
答案 0 :(得分:4)
除非你声明一个,否则一个类总是有一个带有签名的隐式声明的复制赋值运算符:
Statement& operator=(const Statement&)
注意它是不是 const,因此在分配给非const对象时是首选,因为赋值运算符是const。 [编辑:我的错误,const
赋值运算符会抑制隐式赋值运算符,因此应使用非常规const
- 限定赋值运算符。]
(您希望如何分配给I.e. modify,一个const对象?)
(更准确地说,如果子对象声明具有该签名的赋值运算符,则隐式声明的赋值运算符可以具有签名Statement& operator=(Signature&)
,但在您的示例中并非如此。)
答案 1 :(得分:1)