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 语言设计的核心原则之一:透明性。试图重载运算符是违反语言哲学的,应该避免......

于 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 回答
1

没有“等价物”,因为您不能在 Java 中重载赋值运算符。您正在尝试使用 clone() 方法来模仿该行为,但您已经把它倒退了。如果没有运算符重载,您有三种选择:

  1. 编写一个函数,将调用对象变为传入对象的副本。
  2. 编写一个函数,制作调用对象的副本并将其返回给将存储它的其他东西。
  3. 使用复制构造函数。

1. 编写一个函数,将调用对象变为传入对象的副本。

请注意,这与赋值运算符重载相同,只是它被命名为“copy”而不是“operator=”。

如果你想这样做:

foo A;
foo B;
A.copy(B);  // A is now a copy of B.

在 C++ 中:

foo& copy(const foo& rhs)
{
    if(&rhs != this)
    {
        this->m_someInt = rhs.m_someInt;
        this->m_someBar = rhs.m_someBar;
    }
    return *this;
}

在 Java 中:

foo copy(foo rhs)
{
    this.m_someInt = rhs.m_someInt;
    this.m_someBar.copy(rhs.m_someBar);
    return this;
}

请注意,在 C++ 中,按值分配this->m_someBarrhs.m_someBar副本rhs.m_someBar,但在 Java 中,这样的分配将导致两个 foo 对象共享同一个 Bar 对象。因此,如果您不打算共享子主题,也必须在子主题上使用类似的复制机制。

2. 编写一个函数,复制调用对象并将其返回给将存储它的其他东西。

如果你想这样做:

foo A;
foo B;
A = B.clone();  // A is now a copy of B.

在 C++ 中:

foo clone() const  // Ignoring the fact that this is unnecessary in C++ where assignments (and returns) are by-value anyway.
{
    foo theCopy;
    theCopy.m_someInt = this->m_someInt;
    theCopy.m_someBar = this->m_someBar;
    return theCopy;
}

在 Java 中:

foo clone()
{
    foo theCopy = new foo();
    theCopy.m_someInt = this.m_someInt;
    theCopy.m_someBar = this.m_someBar.clone();
    return theCopy;
}

3. 使用复制构造函数。

如果你想这样做:

foo B;
foo A = new foo(B);  // Java version
foo A(B); // C++ version

在 C++ 中:

foo(const foo& rhs)
  :m_someInt(rhs.m_someInt), m_someBar(rhs.m_someBar)
{
}

// Or optionally:
foo(const foo& rhs) = default;

在 Java 中:

foo(foo rhs)
{
    m_someInt = rhs.m_someInt;
    m_someBar = new Bar(rhs.m_someBar);
}

总之,您的问题是您正在尝试以与上面使用 copy() 相同的方式使用 clone() 。最接近等价物的是我的copy方法。我个人的建议是只使用一个复制构造函数并称之为一天。

于 2014-06-05T22:34:35.553 回答
0

如果您尝试覆盖cloneObject 上的方法,它需要具有相同的签名(和大写)。您的方法签名是Clone(Queue).

目前尚不清楚这与尝试模拟运算符重载有什么关系,或者您要重载什么运算符...

于 2013-02-28T06:52:50.447 回答
0

我来自 C++ 背景,所以我知道你来自哪里。我认为这是您所追求的克隆方法。不要忘记实现 Cloneable 接口来告诉 'Object' 这个对象是一个可克隆对象。有关详细说明,请参阅 Effective Java (2nd Ed) item 11。

于 2013-05-21T14:29:19.190 回答