gpt4 book ai didi

c++ - ClientClass 没有命名类型。海湾合作委员会

转载 作者:IT王子 更新时间:2023-10-29 00:59:07 26 4
gpt4 key购买 nike

在编写代码时,我遇到了一个奇怪的问题。我为所有包含保留 1 个文件,我们称它为 includes.h 和类文件,如 clientclass.h 等。

问题是,当我尝试编译我的代码时,出现编译器错误:

/mnt/orange-new/units/includes.h|34|error: ‘ClientClass’ does not name a type|

包含.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

客户端类.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>

成功但未能包含内容,因为包含守卫 CLIENTCLASS_H_INCLUDED 已经定义,即使内容尚不存在。

要解决此问题,您可以从 clientclass.h 中删除 includes.h 的包含,如果它没有用于任何用途。如果您使用 includes.h 中的类型,您可以使用前向声明,它声明一个类存在而不定义它,例如

class ClientClass;

这样您就可以使用指向 ClientClass 的指针和引用,而不必包含 clientclass.h。您不能做的是声明前向声明类型的 values,因为编译器必须知道有关该类型的所有信息(至少,它有多大)才能为值保留内存那种。如果您需要这个,您可能必须将标题分解成更小的部分,并只包含您所依赖的小部分。

因此,例如,您可以执行以下操作:

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 没有命名类型。海湾合作委员会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5019481/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com