2014-03-31 26 views
1

我正在將一些Java代碼翻譯成C++。當我嘗試寫這樣的代碼:在集合中使用嵌套類時的不完整類型錯誤

.H:

class A { 
    private: 
    class B; 
    std::set<B> b_set; 
}; 

的.cpp:

class A::B { 
}; 

我得到了一個不完整的類型錯誤。我知道那是因爲在b_set中使用它之前,嵌套類是不完整的。但是解決它的最好方法是什麼?

回答

2

您可以在.h文件中描述您的整個B類。

下面是一個工作示例。

#include<set> 
class A { 
    private: 
    class B{ 
     B():foo(1){} 
     int foo; 
    }; 
    std::set<B> b_set; 
}; 

但是,如果你想自己的定義和實例分開,你可以這樣做:

#include<set> 
class A { 

    private: 
    class B{ 
     public: 
     B(); 
     private: 
     int someMethod(); 
     int foo; 
    }; 
    std::set<B> b_set; 
}; 

A.cpp

#include "A.h" 
    A::B::B():foo(1){} 
    int A::B::someMethod(){ 
    return 42; 
    } 

一般來說嵌套的類可能是一個嚴重的PITA,因爲你必須跳過所有的環節才能訪問它們。

在嵌套類的另一個很好的參考:Nested class definition in source file

+0

感謝安迪!但在這種情況下,實現在「.h」文件中。這是一個好習慣嗎? – xieziban

+0

@xieziban:看我的編輯。你需要一個非常好的參數來使用一個嵌套類,所以它的一攬子聲明根本沒有。 – AndyG

+0

@xieziban:你爲什麼不喜歡這個答案? – GingerPlusPlus

2

好吧,我來晚了,我知道,我仍然要指出的另一種可能性,如果你想完全遁形B類的內部:

class A 
{ 
    private: 
    class B; 
    std::set<B*> b_set; 
}; 

注意使用集合中的指針。但是,還有一個重要的區別:由於只插入了指針,所以仍然可以將指針插入到具有相同內容的不同實例中。爲了解決這個問題,你需要自定義比較:

class A 
{ 
    private: 
    class B; 
    struct Less 
    { 
    bool operator() (B const* x, B const* y) const 
    { 
     return *x < *y; 
    } 
    }; 
    std::set<B*, Less> b_set; 
}; 

注意(這不是在以前的答覆中提到,但需要有呢!),有必須定義爲B(B或參考比較於指針):

#include <set> 
class A 
{ 
    private: 
    class B; 
    struct Less 
    { 
    bool operator() (B const* x, B const* y) const; 
    }; 
    std::set<B*, Less> b_set; 
}; 

A.cpp

class A::B 
{ 
    friend bool Less::operator() (B const* x, B const* y) const; 
    bool operator<(B const& other) const 
    { 
    return foo < other.foo; 
    } 
    int foo; 
}; 

bool A::Less::operator() (B const* x, B const* y) const 
{ 
    return *x < *y; 
} 

如果您想要或需要出於任何原因,這可以將B完全從頭部隱藏起來。但是,您不能直接從堆棧中直接插入對象,因爲它們沒有被複制,並且指向堆棧的指針很快就會失效。必須特別注意在不再需要對象時刪除對象,否則會導致內存泄漏。請記住,從Java中知道沒有垃圾收集。如果使用C++ 11,可以使用緩解這個問題::性病::的unique_ptr,前::性病:: auto_ptr的:

A.H

#include <set> 
#include <memory> 
class A 
{ 
    private: 
    class B; 
    struct Less 
    { 
    bool operator() (B const* x, B const* y) const; 
    }; 
    std::set<std::unique_ptr<B>, Less> b_set; 
}; 
+0

你的答案可以幫助我alot.thnx –

相關問題