首页 > 解决方案 > 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();
};

标签: c++visual-studioclasscontainersc2079

解决方案


您需要重新编写各种头文件以打破依赖循环。一般规则是:如果您只需要指向类型 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++ 依赖循环”或类似内容。


推荐阅读