消息:: Simbolo使用未定义的类符号

Message::simbolo uses undefined class Symbol

本文关键字:符号 未定义 Simbolo 消息      更新时间:2023-10-16

错误c2079'消息:: simbolo'使用未定义的类'符号'

编译时在此行上生成

    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);
};

类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();
};

您需要重新设计各种标头文件以打破依赖性周期。一般规则是:如果您只需要指针或引用T型,则可以使用前向声明(class T;(而不是完整的类声明(class T { ... },通常在#include后面(。

对于上面的示例,我将遍历每个文件以及您需要的内容:

  • 符号需要SharedEditor的正向声明,因为它仅使用SharedEditor*
  • 消息。H需要SharedEditor的正向声明,但是完整的#include "Symbol.h"(编译器需要知道Symbol的大小要计算Message的大小(
  • 共享的编号需要Message的前向声明(作为参考(,完整的#include "NetworkServer.h"(作为参数传递(和完整的#include "Symbol.h"(在矢量中使用(
  • NetworkServer需要SharedEditor的正向声明(仅与指针一起使用(,但完整的#include "Message.h"(在队列中使用(

如果您仍然有两个需要满足的类,则搜索堆栈的溢出为" C 依赖性周期"或各个部分。