none
사용자클래스로 만든 데이타형으로 값을 리턴할 수 있는지 궁금합니다. RRS feed

  • 질문

  • 제가 사용하는 게임엔진에서는

    Vector3 라는 형식의 데이타형이 있습니다.

    Vector3 pos3  = new Vector3(3,3,3);

    Vector3 vec3 = new Vector3(10.1f,10.0f,11.0f);

    vec3 = new Vector3(2,2,2);

    pos3 = vec3;



    이런 식으로 사용이 가능한 데이타형이 있습니다.

    이런한 형태의 데이타 타입을 만들려고 합니다.


    <질문>

    제가 막힌 부분은

    CustomVector3 pos1 = new CustomVector3(2,2,2);

    CustomVector3 pos2 = pos1;

    이 부분이 막히더군요

    값을 리턴할 때

    public static implicit operator CustomVector3 ( CustomVector3 value){

       return value;

    }


    아래와 같은 오류코드가 발생

    오류코드 "   사용자 정의 연산자는 바깥쪽 형식의 개체를 가져와서 바깥쪽 형식의 개체로 변환할 수 없습니다.   "

    어떻게 해야 하는지 궁금합니다.

    사용자클래스로 만든 데이타형으로 값을 리턴할 수 있는지 궁금합니다.

    2012년 9월 21일 금요일 오전 6:13

답변

  • Deleted
    2012년 9월 21일 금요일 오전 8:48
  • "JI H"님의 답변에 첨언하자면.

    = 연산자는 class 의 경우 참조 복사를, struct의 경우 값 복사를 하는 것으로 고정되었다고 보시면 됩니다. (implicit operator 는 다른 타입과의 형변환을 위해서 제공되는 것임.)

    이 때문에, Shallow copy, deep copy의 문제가 나오는데요. 원하시는 Vector3 클래스는 지금 deep copy를 하려고 하는 것인데, 단순히 = 연산자를 써서는 가능하지 않게 되어 있습니다.

    보통 이런 경우 ICloneable 인터페이스를 구현해서 deep copy를 지원한다는 의사 표시를 하고, ICloneable.Clone 메서드를 이용하여 복사된 객체를 가져오는 별도의 메서드를 구현해야 합니다.

    ------------

    참고로, 일반적으로는 Vector3 와 같은 자료형은 C# 에서 class 보다는 struct 로 정의해서 사용합니다. 게임엔진 언급을 하셨는데요. .NET 용 XNA 게임 프레임워크에서는 그래서 Vector2/3 등의 자료형이 모두 struct 입니다.


    2012년 9월 23일 일요일 오전 6:12

모든 응답

  • "JI H"님의 답변에 첨언하자면.

    = 연산자는 class 의 경우 참조 복사를, struct의 경우 값 복사를 하는 것으로 고정되었다고 보시면 됩니다. (implicit operator 는 다른 타입과의 형변환을 위해서 제공되는 것임.)

    이 때문에, Shallow copy, deep copy의 문제가 나오는데요. 원하시는 Vector3 클래스는 지금 deep copy를 하려고 하는 것인데, 단순히 = 연산자를 써서는 가능하지 않게 되어 있습니다.

    보통 이런 경우 ICloneable 인터페이스를 구현해서 deep copy를 지원한다는 의사 표시를 하고, ICloneable.Clone 메서드를 이용하여 복사된 객체를 가져오는 별도의 메서드를 구현해야 합니다.

    ------------

    참고로, 일반적으로는 Vector3 와 같은 자료형은 C# 에서 class 보다는 struct 로 정의해서 사용합니다. 게임엔진 언급을 하셨는데요. .NET 용 XNA 게임 프레임워크에서는 그래서 Vector2/3 등의 자료형이 모두 struct 입니다.


    2012년 9월 23일 일요일 오전 6:12