在编写代码时,我遇到了一个奇怪的问题。我为所有包含文件保留1个文件,让我们将其称为include.h和诸如clientclass.h之类的类文件。
问题是,当我尝试编译我的代码时,出现编译器错误:
include.h:
#ifndef INCLUDES_H_INCLUDED
#define INCLUDES_H_INCLUDED
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <sys/timeb.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <time.h>
#include <iostream>
#include <cstring>
#include <string>
#include "config.h"
#include "console.h"
#include "clientclass.h"
#include "tcpparser.h"
#include "netmsg.h"
#include "main.h"
Console Konsola;
ClientClass Clients;
TCPThread ParserTCP;
#endif // INCLUDES_H_INCLUDED
clientclass.h:
#ifndef CLIENTCLASS_H_INCLUDED
#define CLIENTCLASS_H_INCLUDED
#include "includes.h"
struct ClientStruct {
int Sock;
int Ident;
int Room;
std::string Name;
std::string IP;
};
class ClientClass {
public:
ClientClass(); // create
int Add();
void Delete(int index);
int Count();
ClientStruct Client[MAX_CLIENTS];
protected:
void Reset(int index);
private:
int _count;
};
#endif // CLIENTCLASS_H_INCLUDED
你能帮我解决我的问题吗?即时通讯的想法:(
最佳答案
您有一个循环依赖项:includes.h -> clientclass.h -> includes.h
。如何解决此问题取决于首先包含哪个 header ,但这总是会造成混淆。最有可能导致生产线
#include <clientclass.h>
成功但无法包含内容,因为即使内容尚不存在,也已定义了include保护
CLIENTCLASS_H_INCLUDED
。要解决此问题,您可能仅能从
includes.h
中删除clientclass.h
的包含内容(如果未用于任何内容)。如果您使用includes.h
中的类型,则可以使用前向声明,这些声明声明存在一个类而不定义它,例如class ClientClass;
这样,您可以使用指向
ClientClass
的指针和引用,而不必包含clientclass.h
。您不能做的是声明前向声明类型的值,因为编译器必须为该类型的值保留内存,然后才知道该类型的所有信息(至少要知道它的大小)。如果需要此功能,则可能必须将标题分解为较小的部分,并仅包含您依赖的较小部分。因此,例如,您可以执行以下操作:
class MyClass;
MyClass * globalPointer;
void doSomething(const MyClass & foobar);
在范围内没有
MyClass
的定义。这两个表达式仅通过指针或引用使用MyClass
。但是以下操作无效:class MyClass;
void doSomethingElse() {
MyClass theobject;
doSomething(theobject);
}
这需要在堆栈上为
MyClass
类型的对象保留空间。如果在范围内没有MyClass
的定义,则编译器无法知道要分配多少内存。在您的情况下,您正在定义
ClientClass
类型的全局值,并且这需要完整定义ClientClass
,而不仅仅是前向声明。您有两种选择:ClientClass
的完整定义后,通过指针保留您的全局值,并将其分配到代码的后面某个位置另一个选择是重新考虑全局变量在这里是否是正确的解决方案。
关于c++ - ClientClass没有命名类型。 GCC Linux,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5019481/