2012-05-31 67 views
0

假設我有兩個類,一個和兩個。一和二基本相同,但兩個可以轉換成一個。指針轉換,無法將兩個*轉換爲一個*

#ifndef _ONE_H_ 
#define _ONE_H_ 

class One 
{ 
private: 
    float m_x; 
    float m_y; 

public: 
    One(); 
    One(float x, float y); 
}; 

#endif 
#ifndef _TWO_H_ 
#define _TWO_H_ 

#include "One.h" 

class Two 
{ 
private: 
    float m_x; 
    float m_y; 

public: 
    Two(); 
    Two(float x, float y); 
    operator One() { return One(m_x, m_y); } 
    operator One*() { return &One(m_x, m_y); } 
    operator One&() const { return *this; } 

    float GetX(void) { return m_x ;} 
    float GetY(void) { return m_y ;} 

    void Print(); 
}; 

#endif 

兩個有權訪問One,但One無權訪問Two。在main.cpp中我有:

One a(4.5f, 5.5f); 

Two b(10.5, 7.5); 

One * c = &b; 

我得到一個錯誤,如果我嘗試做一個指針的一個地址爲二。錯誤是「錯誤C2440:'初始化':不能從'兩*'轉換爲'一*'」

我不能爲我的生活弄清楚如何做到這一點,如果它甚至可能。任何幫助,將不勝感激。

編輯:添加一個新行到Two.h與operator One&() const { return *this; }。我試圖用它來得到這個轉換操作符的工作職能是void TestRefConstPrint(const One &testClass);低於主,這樣就出現了「新的錯誤不能由兩個轉換參數1」到‘常量一個&’。

在main我做:

int main() 
{ 
    Two b(10.5, 7.5); 

    TestRefConstPrint(b); 

    return 0; 
} 

回答

1

你的轉換操作符使轉換Two -> OneTwo -> One*您正在嘗試進行不同的轉換,Two* -> One*

要使用operator One()轉換操作符來執行。轉換,只是這樣做:

One c = b; 

如果你真的想做一個Two* -> One*轉換,就可以了,有一個明確的轉換:

One * c = (One *)&b; 

,或者使用C++ - 風格的轉換:

One * c = reinterpret_cast<One *>(&b); 

但是,請注意,這不使用任何一種轉換運算符,並且執行與Two -> One轉換完全不同:它不創建新對象,它會生成一個指向的指針,指向由Two對象佔用的內存。這通常是一個壞主意,而且你不太可能想這樣做。


最後,有關評論您operator One*():它返回一個懸擺指針(一個指針指向一個局部變量,其超出範圍時,函數返回)。我假設你在嘗試使Two* -> One*轉換工作時編寫了它。你應該刪除它,因爲它沒有做你想做的事。

+0

那麼有什麼辦法讓它變成一個帶有操作符轉換的自動函數嗎?所以當我這樣做時,它會自動執行reinterpret_cast? – jamby

+0

@jamby:不,我強烈建議您進行值轉換('One c = b'),而不是使用第一個轉換運算符。 – HighCommander4

+0

@jamby:我想你可以從'One'中派生'Two'(並且除掉'Two'的數據成員)。然後'Two *'會隱式轉換爲'One *'。不知道更多背景,這很難說是否合適,儘管我的直覺認爲不是。 – HighCommander4