問題描述
我有兩個類聲明如下:
class User
{
public:
MyMessageBox dataMsgBox;
};
class MyMessageBox
{
public:
void sendMessage(Message *msg, User *recvr);
Message receiveMessage();
vector<Message> *dataMessageList;
};
當我嘗試使用 gcc 編譯它時,它給出了以下錯誤:
When I try to compile it using gcc, it gives the following error:
MyMessageBox 沒有命名類型
MyMessageBox does not name a type
推薦答案
當編譯器編譯類 User
并到達 MyMessageBox
行時,MyMessageBox
尚未定義.編譯器不知道 MyMessageBox
存在,因此無法理解您的類成員的含義.
When the compiler compiles the class User
and gets to the MyMessageBox
line, MyMessageBox
has not yet been defined. The compiler has no idea MyMessageBox
exists, so cannot understand the meaning of your class member.
您需要確保 MyMessageBox
在您將其用作成員之前 已定義.這是通過顛倒定義順序來解決的.但是,您有一個循環(huán)依賴:如果您將 MyMessageBox
移到 User
上方,則在 MyMessageBox
的定義中,名稱 User代碼> 不會被定義!
You need to make sure MyMessageBox
is defined before you use it as a member. This is solved by reversing the definition order. However, you have a cyclic dependency: if you move MyMessageBox
above User
, then in the definition of MyMessageBox
the name User
won't be defined!
你能做的是forward declare User
;也就是說,聲明它但不定義它.在編譯期間,已聲明但未定義的類型稱為不完整類型.考慮一個更簡單的例子:
What you can do is forward declare User
; that is, declare it but don't define it. During compilation, a type that is declared but not defined is called an incomplete type.
Consider the simpler example:
struct foo; // foo is *declared* to be a struct, but that struct is not yet defined
struct bar
{
// this is okay, it's just a pointer;
// we can point to something without knowing how that something is defined
foo* fp;
// likewise, we can form a reference to it
void some_func(foo& fr);
// but this would be an error, as before, because it requires a definition
/* foo fooMember; */
};
struct foo // okay, now define foo!
{
int fooInt;
double fooDouble;
};
void bar::some_func(foo& fr)
{
// now that foo is defined, we can read that reference:
fr.fooInt = 111605;
fr.foDouble = 123.456;
}
通過前向聲明User
,MyMessageBox
仍然可以形成一個指針或?qū)λ囊?
By forward declaring User
, MyMessageBox
can still form a pointer or reference to it:
class User; // let the compiler know such a class will be defined
class MyMessageBox
{
public:
// this is ok, no definitions needed yet for User (or Message)
void sendMessage(Message *msg, User *recvr);
Message receiveMessage();
vector<Message>* dataMessageList;
};
class User
{
public:
// also ok, since it's now defined
MyMessageBox dataMsgBox;
};
你不能反過來這樣做:如前所述,類成員需要有一個定義.(原因是編譯器需要知道User
占用了多少內(nèi)存,并且知道它需要知道其成員的大小.)如果你說:
You cannot do this the other way around: as mentioned, a class member needs to have a definition. (The reason is that the compiler needs to know how much memory User
takes up, and to know that it needs to know the size of its members.) If you were to say:
class MyMessageBox;
class User
{
public:
// size not available! it's an incomplete type
MyMessageBox dataMsgBox;
};
這行不通,因為它還不知道大小.
It wouldn't work, since it doesn't know the size yet.
附帶說明,此功能:
void sendMessage(Message *msg, User *recvr);
可能不應該通過指針獲取其中任何一個.你不能在沒有消息的情況下發(fā)送消息,也不能在沒有用戶的情況下發(fā)送消息.這兩種情況都可以通過將 null 作為參數(shù)傳遞給任一參數(shù)來表達(null 是一個完全有效的指針值!)
Probably shouldn't take either of those by pointer. You can't send a message without a message, nor can you send a message without a user to send it to. And both of those situations are expressible by passing null as an argument to either parameter (null is a perfectly valid pointer value!)
相反,使用引用(可能是常量):
Rather, use a reference (possibly const):
void sendMessage(const Message& msg, User& recvr);
這篇關(guān)于“X 未命名類型"C++ 中的錯誤的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!