错误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();
};
SharedEditor类:
#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);
};
NetworkServer类:
#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();
};
答案 0 :(得分:0)
您需要重新整理各种头文件才能打破依赖关系周期。
一般规则是:如果只需要类型T的指针或引用,则可以使用前向声明(class T;
)代替完整的类声明(class T { ... }
,通常在{{ 1}})。
对于上面的示例,我将遍历每个文件以及您需要的内容:
#include
,因此需要向前声明SharedEditor
。SharedEditor*
,但需要完整的SharedEditor
(编译器需要知道#include "Symbol.h"
的大小才能计算Symbol
的大小) Message
(作为引用传递),完整的Message
(作为参数传递)和完整的#include "NetworkServer.h"
(在向量中使用)#include "Symbol.h"
(仅与指针一起使用),但需要完整的SharedEditor
(在队列中使用)如果您仍然有两个需要彼此完全包含的类,请在堆栈中搜索“ C ++依赖周期”或类似内容。