1

「int」、「long」などの型の代入演算子をオーバーロードしたい。つまり、次のようなコードを使用したい:

class CX {
private:
  int data;
...
};

CX obj;
int k;
k = obj;  // k should get the value of obj.data

どうやら代入演算子はフレンド関数にはなり得ません。上記を達成するにはどうすればよいですか?

単純なものが欠けているかもしれませんが、これを行うための構文/方法がわかりません。

また、1 つの IMP 制限 - get/set メソッドは使用できません :: リリース コードでは、CX を int または long (必要に応じて) として型定義しますが、DEBUG コードでは、それをクラスとして使用します (自動何千もの場所で型チェックを行います)。コードは共通である必要があります。その理由は、CX をクラスにすると、コンパイラ (少なくとも使用しているバージョン) がすべての操作を最適化できないためです。


問題の 1 つは、これを通過させたくないということです。

CX x; long p; p = x;

以下のキャストソリューションは、ロング/ショートなどのコードも暗黙的に通過させると思います。(そうでない場合は、まさに私が探しているものです!)。

関連するメモとして、David の質問に答えます。私がリファクタリングしたい理由は、CX を 32 ビットまたは 64 ビットに切り替える機能が必要だからです。そのため、暗黙的な変換を禁止し、コンパイル時にそれらをキャッチしたいと考えています。今、逆 - (許可されていません

CX x = some_64_bit_int;

しかし許す

CX x = some_32_bit_int;

デフォルトでコンパイル時にアサートするテンプレート化された = 演算子を使用して達成しましたが、目的の型に合わせてオーバーロードしました。


これが悪い設計であると感じた場合、または他の代替案を試す必要がある場合 - 私が必要な理由は次のとおりです。何千行ものレガシーコードがあり、何かが「int」に型定義されているだけです。

typedef int CX;

次のような課題があちこちにあります。

CX x; int k; k = x;    // Writing the simplified relevant code here

CXをクラスに変更するプロジェクトに取り組んでいます。最初のフェーズでは、すべてのコンパイル エラー (CX をクラスにする際に発生) を修正し、コードへの変更をできるだけ少なくします。

4

3 に答える 3

17

int への変換のみが必要な場合は、キャスト演算子をクラスに追加できます。

class ABC
{
public:
    operator int() { return data; } // cast operator
private:
    int data;
...
};
于 2010-10-29T07:38:20.183 に答える
2

これはできません。operator=()はメンバー関数でなければならず、 に対してオーバーロードできませんint。次の可能性があります。

  • クラスの暗黙的な変換演算子に依存します。私はそれに対してアドバイスします。後悔せに後で削除したことは一度もありません。
  • 明示的なメンバー関数を作成し、int get() const {return data;}これを呼び出します。
  • intクラスでそれをラップしたいのに、それでもプレーンへの割り当てを許可したい理由を自問してくださいint。においがする。
于 2010-10-29T08:23:56.463 に答える
0

クラスとして CX を持ち、int 型のクラスに変換関数を持つことができます。そうすれば、クラスはこのように機能します

于 2010-10-29T07:39:16.320 に答える