1

C++ の代入演算子を Java にオーバーロードするのと同等のものを実装する方法を理解するのに苦労しています。そのようなことはありませんが、シミュレートする必要があります。Clone() 関数をオーバーライドしようとしましたが、うまくいきません。何か案は?

以下は私のメインです

 Queue p = new Queue();
 Queue q = new Queue();

    p.enqueue('a');
    p.enqueue(9);
    p.enqueue(10);
    p.enqueue(310);
    p.enqueue(8);

    q = p;
    System.out.print(p);

そして、ここにクローン機能があります

public void Clone(Queue other) throws Throwable
{
    System.out.println("test\n");

    if(this == other)
    {

    }
    else
    {            
while(!isEmpty())
  dequeue();

Node tmp = other.head;
while(tmp != null){
    this.enqueue((T)tmp.element);
    tmp = tmp.next;

}   
    }

}
4

6 に答える 6

7

演算子のオーバーロードは Java ではサポートされていません。

演算子のオーバーロードは、Java 言語設計の中心的原則の 1 つである透過性に違反しています。演算子をオーバーロードしようとするのは言語哲学に反するものであり、避けるべきです...

于 2013-02-28T06:52:40.553 に答える
2

演算子のオーバーロードは、Java では実行できません。それを行うには、コンパイラからのサポートが必要です。ただし、Java 構文を理解するプリプロセッサを作成し、ビルド前に実行して、オペレータの呼び出しを適切な関数に変換することはできますが、それはやり過ぎです。

clone演算子のオーバーロードとは関係ありません。

于 2013-02-28T06:54:04.270 に答える
2

明示的なコピー コンストラクターを記述する必要があります。Java では、すべてがポインター (または「参照」と呼ばれる) であるため、p を q に代入すると、p と q が同じオブジェクトを指していると言えます。

q = new Queue(p)

適切なコンストラクターを実装したと仮定すると、あなたが望むものです。

編集:あなたが提案していることは、構文「q = p」では不可能です。代入演算子を「シミュレート」したい場合は、Queue に新しいメソッドを記述する必要があります。たとえば、Java プログラマーが加算演算子のオーバーロードを「シミュレート」する方法を次に示します。

a.add(b);

したがって、あなたの場合、キューを取り、そのデータをコピーし、これらのコピーを他のオブジェクトの内部データに割り当てる「割り当て」メソッドを作成する必要があります。

q.assign(p);

public void assign(Queue other) {
  this.primitive = other.primitive;
  this.someObject = new SomeObject(other.someObject);
}

それはあなたが得ようとしているのとほぼ同じです。

于 2013-02-28T06:56:27.103 に答える
0

Objectのメソッドをオーバーライドしようとしている場合cloneは、同じ署名 (および大文字と小文字) が必要です。メソッドの署名はClone(Queue).

ただし、これが演算子のオーバーロードをシミュレートしようとすることにどのように関連するのか、またはどの演算子をオーバーロードしようとしているのかは明確ではありません...

于 2013-02-28T06:52:50.447 に答える