2012-02-21 61 views
1

有類似下面的代碼(簡化):如何重載operator =返回指向成員的指針?

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副本,但返回相同的指針,如果我做出pstruct->member1變化的變化是obj.data->element1相同(和相反)。

這可能嗎?

謝謝

+1

請注意,您的示例從不調用'operator ='。對象初始化與對象分配不同。 – 2012-02-21 15:02:31

回答

7

聽起來像是你想創建一個轉換操作符一個MyStruct*MyClass

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

我會盡可能避免將類型轉換爲類型。當你想要的時候(如問題中)隱式轉換就會引入,但是當你不需要時,打開代碼以允許代碼中的愚蠢錯誤。突然'if(obj)'是有效的,就像'obj + 5'這是兩個你可能不想要的操作,現在將被允許。這是開放的一大堆蠕蟲... – 2012-02-21 14:33:02

+0

@大衛:我同意,但從這個問題很難說什麼OP *真正*想要實現。 – sth 2012-02-21 14:35:36

+0

就是這樣!非常感謝你! – LaLeX 2012-02-21 14:44:43

2

沒問題。

MyClass obj; 

MyStruct *pstruct = obj.data; 
+1

@LuchianGrigore:自我撰寫評論以來,答案已被編輯。 – 2012-02-21 14:29:21

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(); 
}