2017-01-21 1 views
0

내가메서드 호출의 복사본을 가지고하는 방법 - C++ 및 Java 차이를

struct Node { 
    int x; 

    Node(int x) : x(x) {} 

    friend std::ostream & operator << (std::ostream &o, const Node &n) { 
     o << n.x; 
     return o; 
    } 
}; 

void Foo(Node n) { 
    n.x--; 
    cout << "Foo: " << n << endl; 
} 

void Foo2(Node &n) { 
    n.x--; 
    cout << "Foo2: " << n << endl; 
} 

int main() { 
    Node n(5); 
    cout << n << endl; 
    Foo(n); 
    cout << n << endl; 
    Foo2(n); 
    cout << n << endl; 

    return 0; 
} 

++ C의 몇 가지 코드를 가지고 ... 그리고 출력이

5 
Foo: 4 
4 
Foo2: 3 
4 

입니다 ... 지금은 도달 Java에서 동일

class Node { 
    public int x; 

    Node(int x) { 
     this.x = x; 
    } 

    @Override 
    public String toString() { 
     return Integer.toString(x); 
    } 
} 

public class NodeHomevork { 
    static void Foo(Node n) { 
     n.x--; 
     System.out.println("Foo: " + n); 
    } 

    static void Foo2(Node n) { 
     Node n2 = new Node(n.x); 
     n2.x--; 
     System.out.println("Foo2: " + n2); 
    } 

    public static void main(String[] args) { 
     Node n = new Node(5); 
     System.out.println(n); 
     Foo(n); 
     System.out.println(n); 
     Foo2(n); 
     System.out.println(n); 
    } 
} 

그러나 Foo2에서 새 키워드를 사용하지 않고 Foo2를 구현하는 방법을 모르겠다. 아이디어가 있으면 어떤 게시물에 대해서도 고마워 할 것입니다. 감사합니다.

+0

'Java'는 참조 유형 언어입니다. 변수를 만들 때'new'를 피할 방법이 없습니다. 'C#'는 값 유형이라는'struct'를 가지고 있습니다. 그것은 새로운 것을 사용하지 않고'struct' 변수를 만들 수 있음을 의미합니다. 반면에'C++ '은 값 타입 언어이며,'C++'퍼포먼스가 뛰어난 이유 중 하나는 값 타입에 대한 이중성입니다. – MRB

+0

Possible [dupe] (http://stackoverflow.com/questions/869033/how-do-i-copy-an-object-in-java)? 그렇지 않은 경우, 관련성이 높습니다. 추가 할 수있는 유일한 것은 Java 참조에 의한 값 전달 만 존재한다는 것입니다. – George

+0

'new '를 다른 곳으로 옮길 수 있습니다. 가장 깨끗한 해결책은'Node newInstanceFromExisting (Node node)'와 같은 정적 메소드를 클래스에 추가하는 것입니다. 'new'는'newInstanceFromExisting' 안에 있습니다. –

답변

0

C++에서 인수를 Foo2에 넣으면 개체가 복사됩니다. 자바에서는이 복제를 사용할 수있다() 메소드 :

class Node implements Cloneable 
{ 
    public int x; 

    Node(int x) { this.x = x; } 

    @Override 
    public String toString() { return Integer.toString(x); } 

    @Override 
    protected Node clone() throws CloneNotSupportedException 
    { 
     Node copy = null; 
     copy = (Node)super.clone(); 
     return copy; 
    } 
} 

FOO2 코드 :

static void Foo2(Node n) 
{ 
    Node n2 = n.clone(); 
    n2.x--; 
    System.out.println("Foo2: " + n2); 
} 

OR :

@Override 
public Node clone() throws CloneNotSupportedException { ... } //public! 

static void Foo2(Node n) 
{ 
    n.x--; 
    System.out.println("Foo2: " + n); 
} 

그리고 Foo2(n.clone()); 를 통해 전화를하지만 난 당신이 첫 번째 옵션을 사용한다고 생각합니다, 왜냐하면 C++ 코드에서는 복제본이 내부 메서드이기 때문입니다.

+1

[clone is broken] (http://www.artima.com/intv/bloch13.html) – MRB

+0

일반적으로'clone'을 오버라이드하면'public'에 대한 액세스가 향상됩니다. –

+0

@Konrad M. 덕분에, 좋은 생각이야! –

관련 문제