消息:: simbolo使用未定义的类Symbol

时间:2019-05-07 13:53:08

标签: c++ visual-studio class containers c2079

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

1 个答案:

答案 0 :(得分:0)

您需要重新整理各种头文件才能打破依赖关系周期。 一般规则是:如果只需要类型T的指针或引用,则可以使用前向声明(class T;)代替完整的类声明(class T { ... },通常在{{ 1}})。

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

  • Symbol.h仅需要使用#include,因此需要向前声明SharedEditor
  • Message.h需要前向声明SharedEditor*,但需要完整的SharedEditor(编译器需要知道#include "Symbol.h"的大小才能计算Symbol的大小)
  • SharedEditor需要前向声明Message(作为引用传递),完整的Message(作为参数传递)和完整的#include "NetworkServer.h"(在向量中使用)
  • NetworkServer需要向前声明#include "Symbol.h"(仅与指针一起使用),但需要完整的SharedEditor(在队列中使用)

如果您仍然有两个需要彼此完全包含的类,请在堆栈中搜索“ C ++依赖周期”或类似内容。