在编写代码时,我遇到了一个奇怪的问题。我为所有包含文件保留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,而不仅仅是前向声明。您有两种选择:
  • 进一步 segmentation 包含文件,以便您可以仅包含所需的一小部分
  • 在包含完ClientClass的完整定义后,通过指针保留您的全局值,并将其分配到代码的后面某个位置

  • 另一个选择是重新考虑全局变量在这里是否是正确的解决方案。

    关于c++ - ClientClass没有命名类型。 GCC Linux,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5019481/

    10-13 07:20