2012-06-12 42 views
0

所以我一直在创造这个“框架”的东西,基本上拼的源代码(着色器)。当我提出创建一个语句类并重载所有操作符(完全改变它们的含义)以自然地形成其他语句的想法时,我认为我非常聪明。它看起来像这样:如何更改operator =的返回值?

class Statement { 

public: 
    Statement operator=(const Statement &other) const; 
    Statement operator+(const Statement &other) const; 
    ... 

} 

然而,当我以为我做了,事实证明,运营商=完全忽略返回值,而是前的“=”只是始终返回的对象。我是否正确地理解,没有办法做到这一点?

编辑:好吧,对不起,示例我提供的编译(我有运营商以一种过于超载,没有工作)。

编辑2:运算符=实际上是有目的的:它的意图是创建一个新的赋值语句对象。

实施例:

Block b; // Represents a sequence of commands. 
Statement var1, var2; // Represent some variables. 
... 
b.append(var1 = var2); 

预期:B包括命令VAR1 = VAR2;

观察:1b包括VAR1;

已解决:问题是因为我使用派生类而不是使用其默认运算符=的Statement。感谢大家。

+1

怎么办你的意思是“忽略返回值,而是总是在'=之前返回对象““?您能否添加一个完整的示例以及预期的和观察的输出? – Mankarse

+0

@Mankarse完成。 – Detheroc

+1

@Dethroc:你举的例子仍然缺少大量的代码(如何'声明::运算符='实现如何'Block'实现的?)。 [我尝试填充空格,它对我有用](http://ideone.com/5eSls)。 – Mankarse

回答

4

除非你宣布一个,一类总是与签名的隐式声明的拷贝赋值运算符:

Statement& operator=(const Statement&) 

值得注意的是常量,因此最好将其分配给非const时对象,因为你的赋值运算符是const。 [编辑:我的错误,const赋值运算符抑制隐性之一,所以非常规const -qualified赋值运算符应使用。]

(你怎么能指望分配到即修改const对象?)

(NB更准确,隐式声明的赋值运算符可以有签名Statement& operator=(Signature&)如果子对象声明与签名赋值运算符,但是这不是你的情况为例。)

+1

为了迂回,即使没有声明一个类,类也不会_always_拥有隐式声明的复制赋值运算符。尝试包含一个const或引用成员 – David

+2

@Dave:它仍将被隐式声明,只是没有被隐式定义(或者是迂腐的,它会被隐式地定义为删除)。 – ildjarn

+0

@ildjarn I stand corrected – David

1

你的代码是正确的(它与g++-4.5.1g++-4.3.4,锵和VS2010的作品)。如果它不起作用,那么你的编译器肯定有问题,或者肯定有一些你没有告诉我们的东西。

+0

我不明白这是如何保证downvote(除非它被标记为'不是答案')... – ildjarn

+0

包含'const'复制赋值运算符的代码不是“很好”,特别是当问题问为什么返回时赋值运算符的值与预期值不匹配。它与预期不符的原因是因为复制赋值运算符是“const”,这是异常和令人困惑的。 –

+0

@Jonathan:你在说'Statement',但实际的可编译代码(涉及'A'和'B')没有这个问题 - 大概这个答案只是指后者。编辑:AAA,现在代码已经消失。 : -/ – ildjarn