2012-02-21 2 views
1

다음 코드 같은 것을 (간체) 데 : 내가 pstruct->member1의 변화의 변화를 만들 그래서 만약 내가 obj.data의 복사본을 생성하지만 같은 포인터를 반환하고 싶지 않은연산자를 오버로드하는 방법 = 멤버에 대한 포인터를 반환 하시겠습니까?

struct MyStruct { 
    int member1; 
    int member2; 
}; 

class MyClass { 
    MyStruct *data; 
} 


MyClass obj; 

// put obj.data in pstruct 
// so obj.data->element1 is the same as pstruct->element1 
MyStruct *pstruct = obj; 

것은 obj.data->element1에서 동일 (반대편).

이것이 가능합니까?

감사합니다.

+1

예제에서는 절대로 operator ='를 호출하지 않습니다. 개체 초기화는 개체 할당과 다릅니다. –

답변

7

는 소리 :

class MyClass { 
    MyStruct *data; 
public: 
    operator MyStruct*() { 
     return data; 
    } 
}; 
+3

가능할 때마다 형식에 변환을 추가하지 않아야합니다. 암시 적 변환은 (질문 에서처럼) 원할 때 시작하지만 그렇지 않을 때는 코드를 열어 코드에서 바보 같은 실수를 허용합니다. 갑자기'if (obj)'가 유효하며'obj + 5'도 마찬가지입니다. 두 가지 작업이 필요하지 않을 수도 있고 이제 허용 될 수도 있습니다. 이것은 벌레의 큰 깡통을 여는 것입니다 ... –

+0

@ Davidid : 나는 동의하지만, OP에서 * 정말로 * 달성하고자하는 것을 말하기는 어렵습니다. – sth

+0

그게 다야! 고마워요! – LaLeX

2

아무 문제 없습니다. MyStruct*MyClass A로부터 당신이 만드는 변환 연산자를 원하는처럼

MyClass obj; 

MyStruct *pstruct = obj.data; 
+1

@LuchianGrigore : 내가 코멘트를 쓴 이후로 대답이 수정되었습니다. –

2

우선 당신이 포인터에 대한 연산자를 오버로드 할 수 없다는 것입니다, 좋은 것은 당신이 없다는 것입니다 필요, 당신은 단지 appropriatedly 포인터를 할당해야합니다

MyClass obj; 
MyStruct *pstruct = obj.data; // Assuming that `data` is accessible here 

당신이 내부 data 멤버에 액세스 할 수없는 경우, 액세스 (포인터를 반환하는 멤버 함수 인 캡슐화)를 제공하거나 호출 코드 인 friendMyClass으로 만들어 내부 형식에 대한 액세스 권한을 부여해야합니다 (캡슐화가 조금씩 중단됩니다).

1

변환 연산자를 사용하여 원하는 작업을 수행 할 수 있지만 getter method으로 작성하는 것이 좋습니다. 이렇게하면 암시 적 변환과 관련된 문제를 피할 수 있습니다.

class MyClass { 
private: 
    MyStruct *data; 
public: 
    MyStruct* GetData() const { return data; } 
}; 


int main() { 
    MyClass obj; 
    MyStruct *pstruct = obj.GetData(); 
    MyStruct *pstruct2; 
    pstruct = obj.GetData(); 
} 
관련 문제