2012-10-29 51 views
0

我從Java背景學習C++,這裏是我剛認識的問題:如何實現一個方法返回類似對象中的Java ++用C

比方說,我有一類名爲A.我使用名爲AWrapper的包裝器。我希望A有一個鏈接到它的包裝,不只是AWrapper,而是任何包裝。因此,在Java中,我可以按照以下實現這一點:

public class A { 
    Object tag; 
    Object getTag() { 
     return tag; 
    } 

    void setTag(Object tag) { 
     this.tag = tag; 
    } 
} 

及其包裝:

public class AWrapper { 
    A a; 
    public AWrapper(A a) { 
     this.a = a; 
     a.setTag(this); 
    } 
} 

但在C++中,一切並非如此簡單。首先,C++沒有Java中的Object。其次,如果我不使用Object,但使用AWrapper作爲getTag()中的返回值,則會產生循環依賴問題。任何人都可以告訴我如何解決這個問題?

真的很抱歉,如果我的問題是愚蠢的,我的C++技能仍然很差,所以任何幫助將不勝感激!

+8

你在想這個錯誤的方法。 C++ *很簡單,但它不同*。忘記你如何在Java中做事,並開始學習C++的C++方式。 –

+2

歡迎來到複雜且具有許多隱藏細節,但不能得到 - 因爲它只是最好的語言,名爲C++的朋友。 –

+1

Java的對象都從Object隱式繼承。從理論上講,你可以做一切你個人正在從一些根類繼承的東西(比如Object)。接下來,Java有全自動垃圾收集功能,而C++ ......好吧,在C++中,很少有人發現除引用計數之外的任何值得的事情:在C++中,您需要管理對象的生命週期,而不是將其留給通常處理的框架。你必須習慣的另一件事是對象的INSTANCE和POINTERS之間的區別:在Java中,每個非平凡的對象基本上都是一個POINTER。 – Yakk

回答

2

我認爲,所有你需要的是一個空指針 - 這編譯,但我還沒有與它玩耍了:

class A 
{ 
public: 
    void *tag; 
    virtual void *getTag() 
    { 
     return tag; 
    } 

    virtual void setTag(void *tag) 
    { 
     this->tag = tag; 
    } 
}; 

class AWrapper 
{ 
public: 
    A *a; 
    AWrapper(A *a) 
    { 
     this->a = a; 
     a->setTag(this); 
    } 
}; 
+0

感謝您的回答!我會嘗試一下,讓你知道結果。但我還有一個問題:在這種情況下,我可以使用共享指針而不是指針嗎?更具體地說,共享指針是否可以包裝void指針? –

+0

顯然 - 我沒有使用它自己雖然 - http://stackoverflow.com/questions/4807286/shared-void-pointers-why-does-this-work –

+4

我會使用一些不痛苦的東西,如'提升:: any'。使用'void *'會引起一些不舒服的生命期問題。 –

1

我不知道你的使用情況是什麼,所以我不知道,如果這將解決你的問題(如果你真的有一個):

template<typename TagT> 
class A 
{ 
    TagT* ptag_; 
public: 
    A() :ptag_() {} 

    TagT& getTag() { return *ptag_; } 

    void setTag(TagT& tag) { ptag_ = &tag; } 
}; 



class AWrapper 
{ 
    A<AWrapper> a_; 
public: 
    AWrapper(A<AWrapper> a) { 
     a_ = a; 
     a_.setTag(this); 
    } 
}; 

雖然在這種情況下,A類實際上並不是一個類。它是一個類模板。每種類型的A只能存儲一種類型的標籤。因此,A<X>將只能有一個X類型的標籤,而A<Z>只能有Z類型的標籤。我不知道這個限制是否符合你的要求,因爲你的要求對我來說完全不清楚。

+0

謝謝!它看起來很有前途,但不幸的是它不適合我的設計。無論如何,它給了我一個想法如何處理我的問題。 –

相關問題