2010-03-28 60 views
3

我有一樣的東西:如何將結構移動到類中?

typedef struct Data_s { 
    int field1; 
    int field2; 
} Data; 

class Foo { 
    void getData(Data& data); 
    void useData(Data& data); 
} 

在另一個類的功能,我可以做:

class Bar { 
    Data data_; 
    void Bar::taskA() { 
    Foo.getData(data_); 
    Foo.useData(data_); 
    } 
} 

是否有移動數據排除在全球範圍內,進入富而不創建方式一個新班級?數據鏡像我在別處使用的庫中存在的結構。 (即相同的字段,只是名稱不同,後來我將數據轉換爲另一個結構體,我這樣做是因爲Foo是一個抽象類,並且使用該庫的派生類只是其中的一個)。

當前,只是粘貼它裏面的類和DataFoo::Data無處不在工作。

class Foo { 
    typedef struct Data_s { 
    int field1; 
    int field2; 
    } Data; 
    ... 
} 

我得到'Data' in class 'Foo' does not name a typeBar data_;

+0

所以,你想創建一個類,它類似於Data_s?或者你想在運行時將其成員的值複製到一個類中? – Cam 2010-03-28 22:25:32

+1

struct和class只有幾個區別,你想通過'將struct移動到class'來實現什麼?可能要澄清一下你究竟想要做什麼會有所幫助。 – stefanB 2010-03-28 22:29:08

+0

增加/澄清。那個更好嗎? – Kache 2010-03-28 22:55:13

回答

4

可以定義在類中的結構,但你需要提前的地方做它,你第一次使用它。結構,像類本身,必須以使用它們前置聲明:

class Foo 
{ 
public: 
    struct Data 
    { 
     int field1; 
     int field2; 
    }; 

    void getData(Foo::Data& data) {} 
    void useData(Foo::Data& data) {} 
}; 

void UseFooData() 
{ 
    Foo::Data bar; 
    Foo f; 
    f.getData(bar); 
    f.useData(bar); 
} 

編輯:更新例如使用相同的字段/類名,如在原來的問題列出。請注意,爲了在類別Foo之外可見,需要將Data聲明爲public,其他代碼需要將其引用爲Foo::Data

+1

由於問題的結構Data_s和類Foo,你可以修改你的答案呢? – 2010-03-28 22:30:10

2

更準確地說,Foo :: Data不能在您提供的代碼片段中訪問。班級成員默認爲私人可見度。其次,當你使用C++時,不推薦typedef用於結構聲明(還有其他有效的用途,但你的用法不是)。

試試這個修改後的版本,而不是:

class Foo { 
public: 
    struct Data { 
    int field1; 
    int field2; 
    }; 
    ... 
} 
+0

只是好奇,什麼時候推薦結構聲明的typedef呢? – Kache 2010-03-28 23:37:20

+0

永遠不會在C++中。在C中,如果你沒有使用typedef,你必須在每個地方說「struct that」,typedef讓你說「那個」。用C++你不需要結構,所以typedef是無用的。 Typedef還有其他用途,特別是在存在模板的情況下,但對類或結構體定義的typedef是一種快速發現C++程序員零C++經驗的方法。 – 2010-03-29 00:20:10

+0

實際上,我只是在做b/c,我是用minizip和unrar庫的例子,它們用C @@ @ – Kache 2010-03-29 04:05:48

相關問題