0

だから私は基本的にソースコード(シェーダー用)をまとめるこの「フレームワーク」を作成しています。ステートメント クラスを作成し、そのすべての演算子をオーバーロードして (意味を完全に変えて) 他のステートメントを自然な方法で形成するというアイデアを思いついたとき、私はかなり賢いと思いました。次のようになります。

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 が含まれます。

解決済み:問題は、デフォルトの operator= を使用する Statement の代わりに派生クラスを使用していたためでした。みんな、ありがとう。

4

2 に答える 2

4

宣言しない限り、クラスには常に暗黙的に宣言された署名付きのコピー代入演算子があります。

Statement& operator=(const Statement&)

これは const ではないことに注意してください。代入演算子は const であるため、非 const オブジェクトに代入する場合に優先されます。[編集: 私の間違いです。const代入演算子は暗黙の代入演算子を抑制するため、型にはまらないconst-qualified 代入演算子を使用する必要があります。]

(つまり、const オブジェクトを変更するにはどのように割り当てると思いますか?)

(より正確に言うとStatement& operator=(Signature&)、サブオブジェクトがその署名で代入演算子を宣言する場合、暗黙的に宣言された代入演算子は署名を持つことができますが、あなたの例ではそうではありません。)

于 2012-06-12T23:10:11.143 に答える
1

あなたのコードは問題ありません (そして、g++-4.5.1g++-4.3.4、Clang および VS2010 で動作します)。うまくいかない場合は、コンパイラに何か問題があるか、あなたが私たちに伝えていない何かがあるに違いありません。

于 2012-06-12T23:07:56.423 に答える