c++ - Message::simbolo 使用未定义的类符号
问题描述
错误 C2079 'Message::simbolo' 使用未定义的类 'Symbol'
编译时在这一行生成
Symbol simbolo;
这是我的 C++ 代码:
班级留言
#pragma once
#include <string>
#include "Symbol.h"
#include "SharedEditor.h"
class SharedEditor;
class Symbol;
class Message
{
private:
SharedEditor* sender;
int action; //1 inserted 2 deleted
Symbol simbolo;
public:
Message();
Message(SharedEditor* sender, Symbol nuovosimbolo, int action);
~Message();
};
类符号
#pragma once
#include "SharedEditor.h"
#include <vector>
class SharedEditor;
class Message;
class Symbol
{
char character;
int siteID;
SharedEditor* generator;
std::vector<int> position;
public:
Symbol();
Symbol(char ch, SharedEditor* source, int ID, std::vector<int> pos);
~Symbol();
};
类共享编辑器:
#pragma once
#include "NetworkServer.h"
#include "Message.h"
#include "Symbol.h"
class Message;
class Symbol;
class SharedEditor
{
private:
NetworkServer& _server;
int _siteId;
std::vector<Symbol> _symbols;
//other functions
public:
SharedEditor(NetworkServer ns);
~SharedEditor();
void process(const Message& m);
};
类网络服务器:
#pragma once
#include <iostream>
#include <vector>
#include <queue>
#include "SharedEditor.h"
#include "Message.h"
class SharedEditor;
class Message;
class NetworkServer
{
private:
std::vector<SharedEditor*> connected;
std::queue<Message> codaMessaggi;
public:
int connect(SharedEditor* sharedEditor);
void disconnect(SharedEditor* sharedEditor);
void send(const Message& m);
NetworkServer();
~NetworkServer();
};
解决方案
您需要重新编写各种头文件以打破依赖循环。一般规则是:如果您只需要指向类型 T 的指针或引用,则可以使用前向声明 ( class T;
) 而不是完整的类声明 ( class T { ... }
,通常在 a 后面#include
)。
对于上面的示例,我将检查每个文件以及您需要什么:
- Symbol.h 需要前向声明
SharedEditor
,因为它只使用SharedEditor*
. - Message.h 需要一个前向声明
SharedEditor
,但是一个完整的#include "Symbol.h"
(编译器需要知道 a 有多大Symbol
来计算 的大小Message
) - SharedEditor 需要前向声明
Message
(作为引用传递)、完整#include "NetworkServer.h"
(作为参数传递)和完整#include "Symbol.h"
(在向量中使用) - NetworkServer 需要一个前向声明
SharedEditor
(仅与指针一起使用),但需要一个完整的#include "Message.h"
(在队列中使用)
如果您仍然有两个需要相互完全包含的类,请在堆栈溢出中搜索“C++ 依赖循环”或类似内容。
推荐阅读
- c++ - 如何将调试信息附加到 LLVM Pass 中的指令中
- python - python imap 电子邮件收集器错误
- python - Django centos服务器没有收到请求
- asp.net-core - 如何避免在 ASP.NET Core MVC 中将我的视图组件 cshtml 命名为“Default.cshtml”?
- maxima - 千里马图自动保存
- java - 变音符号问题,从数据库java获取数据
- google-apps-script - 将 gdoc 转换为图像
- sublimetext3 - 命令面板中缺少命令
- python - 来自纯 SQL 查询的实例化模型类对象?
- sas - SAS 9.4 使用 IFN 函数结果