我正在將一些Java代碼翻譯成C++。當我嘗試寫這樣的代碼:在集合中使用嵌套類時的不完整類型錯誤
.H:
class A {
private:
class B;
std::set<B> b_set;
};
的.cpp:
class A::B {
};
我得到了一個不完整的類型錯誤。我知道那是因爲在b_set
中使用它之前,嵌套類是不完整的。但是解決它的最好方法是什麼?
我正在將一些Java代碼翻譯成C++。當我嘗試寫這樣的代碼:在集合中使用嵌套類時的不完整類型錯誤
.H:
class A {
private:
class B;
std::set<B> b_set;
};
的.cpp:
class A::B {
};
我得到了一個不完整的類型錯誤。我知道那是因爲在b_set
中使用它之前,嵌套類是不完整的。但是解決它的最好方法是什麼?
您可以在.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
好吧,我來晚了,我知道,我仍然要指出的另一種可能性,如果你想完全遁形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;
};
你的答案可以幫助我alot.thnx –
感謝安迪!但在這種情況下,實現在「.h」文件中。這是一個好習慣嗎? – xieziban
@xieziban:看我的編輯。你需要一個非常好的參數來使用一個嵌套類,所以它的一攬子聲明根本沒有。 – AndyG
@xieziban:你爲什麼不喜歡這個答案? – GingerPlusPlus