Message::simbolo 使用未定义的 class 符号
Message::simbolo uses undefined class Symbol
错误 C2079 'Message::simbolo' 使用未定义 class 'Symbol'
是编译时在这一行生成的
Symbol simbolo;
这是我的 C++ 代码:
class留言
#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();
};
class符号
#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();
};
class 共享编辑器:
#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);
};
class 网络服务器:
#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 声明(class T { ... }
,通常后面一个#include
).
对于上面的示例,我将查看每个文件以及您需要的内容:
- Symbol.h 需要
SharedEditor
的前向声明,因为它只使用 SharedEditor*
.
- Message.h 需要
SharedEditor
的前向声明,但是完整的 #include "Symbol.h"
(编译器需要知道 Symbol
有多大才能计算 Message
)
- SharedEditor 需要前向声明
Message
(作为参考传递)、完整的 #include "NetworkServer.h"
(作为参数传递)和完整的 #include "Symbol.h"
(在向量中使用)
- NetworkServer 需要
SharedEditor
的前向声明(仅用于指针),但完整的 #include "Message.h"
(用于队列)
如果您仍然有两个 class 需要完全包含彼此,请搜索堆栈溢出以查找 "C++ dependency cycle" 或类似内容。
错误 C2079 'Message::simbolo' 使用未定义 class 'Symbol'
是编译时在这一行生成的
Symbol simbolo;
这是我的 C++ 代码:
class留言
#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();
};
class符号
#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();
};
class 共享编辑器:
#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);
};
class 网络服务器:
#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 声明(class T { ... }
,通常后面一个#include
).
对于上面的示例,我将查看每个文件以及您需要的内容:
- Symbol.h 需要
SharedEditor
的前向声明,因为它只使用SharedEditor*
. - Message.h 需要
SharedEditor
的前向声明,但是完整的#include "Symbol.h"
(编译器需要知道Symbol
有多大才能计算Message
) - SharedEditor 需要前向声明
Message
(作为参考传递)、完整的#include "NetworkServer.h"
(作为参数传递)和完整的#include "Symbol.h"
(在向量中使用) - NetworkServer 需要
SharedEditor
的前向声明(仅用于指针),但完整的#include "Message.h"
(用于队列)
如果您仍然有两个 class 需要完全包含彼此,请搜索堆栈溢出以查找 "C++ dependency cycle" 或类似内容。