Сообщение :: simbolo использует неопределенный класс Symbol - PullRequest
0 голосов
/ 07 мая 2019

Ошибка 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();

};

класс 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 голосов
/ 07 мая 2019

Вам нужно переработать различные заголовочные файлы, чтобы разорвать цикл зависимости.Общее правило таково: если вам нужны только указатели или ссылки на тип T, вы можете обойтись без предварительного объявления (class T;) вместо полного объявления класса (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" (используется в очереди)

Если у вас все еще есть два класса, которые требуют полного включения друг друга, переполнение стека поиска для«Цикл зависимости C ++» или что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...