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" 或类似内容。