7

我试图理解这个用 C++ 编写的运算符函数并将其转换为 Java。

Class& Class::operator=(const Class& In) {

   properties = In.properties;

   return *this;

}

这是否只是复制类对象的实例和属性?我已经为此写了一些东西:

public static Class copy(Class obj) {
    //returns new instance of Class individual
    Class copy =  new Class(obj.row_num, obj.col_num, obj.input_length, obj.output_length, obj.max_arity, obj.function_length, obj.levels_back);
    copy.genes = obj.genes.clone();
    return copy;
}

我在正确的轨道上吗?非常感谢您的帮助。

4

3 回答 3

3

&号指定 C++ 中的引用。需要提供类似于 Java 对象“开箱即用”提供的行为,因为 Java 通过引用来管理对象。

传递引用时,C++ 中不会进行复制。const事实上,避免复制是使用引用作为函数参数的一个主要原因。

您显示的代码也不执行复制:它根据“分配”的值更改其状态。在 Java 中对此进行建模的最接近的方法是提供一种assign(Class other)方法来更改当前状态以匹配传入的对象的状态:

Class assign(Class other) {
    this.properties = other.properties;
    return this;
}

您将需要使用此方法代替 C++ 的赋值,如下所示:

Class clOne(args1);
Class clTwo(args2);
clOne = clTwo;      // Using the assignment operator

变成这样:

Class clOne = new Class(args1);
Class clTwo = new Class(args2);
clOne.assign(clTwo); // Using the assignment method instead of the operator
于 2013-10-17T14:02:37.627 回答
2

我在正确的轨道上吗?

有点儿。但不完全是。C++ 区分重新分配现有对象和创建新对象。

Java没有。您不能重新分配给 Java 1中的现有对象(但您当然可以重新分配引用)。在 Java 中,为了复制对象(而不是为其分配引用),您通常会使用复制构造函数:

Class(Class other) {
    // Copy members of `other` into `this`.
}

然后按如下方式使用它:

Class x = new Class(something here);
Class y = new Class(x); // copy

特别是,这是所有 Java 容器都实现的。我不会依赖clone。首先,clone应该只在类实现标签接口时使用Cloneable。其次,它clone的设计可以说是坏了,不推荐使用


1当然,您可以重新分配对象的成员(除非它们是final),并且您可以通过提供一种方法assign来模仿 C++ 的复制赋值运算符。然而,这不是 Java 中做事的传统方式(尽管它可能在某些特殊情况下占有一席之地)。

于 2013-10-17T14:00:02.097 回答
2

你几乎走在正确的轨道上。当直接从一个对象分配(复制)到另一个对象时,使用 C++ 中的复制赋值运算符。由于 Java 对象只能通过引用访问,因此这样的赋值是没有意义的。为了完全匹配 C++ 语义,Java 等价物将是:

public Class copy(Class obj) {
    row_num = obj.row_num;
    col_num = obj.col_num;
    // etc., etc.
    genes = obj.genes.clone();
    return this;
}
于 2013-10-17T14:00:19.343 回答