Классы в разных заголовках не узнают друг друга? - PullRequest
0 голосов
/ 27 сентября 2018

Несмотря на то, что прекомпилятор Visual Studio или как он там называется, распознает Graph как класс из другого заголовка, после сборки я получаю самые нелепые ошибки, действующие так, как будто я никогда раньше не упоминал другие заголовки.Сначала я не стал объявлять оба класса, и из этого вытекает первый набор ошибок ниже, но затем я попытался объявить вперед, и есть похожие ошибки, связанные со структурой самих классов.Использование функций из другого класса производит их, что показывает, что заголовочные файлы НИЧЕГО не делают.Они не знают о функциях друг друга, и я не знаю почему.

Vertex.h :

#pragma once
#include "Graph.h"
#include <vector>

class Graph;
class Vertex
{
    int unique_id;
    int longestChain = 0;
    int chainComponent_id;
    std::vector<int> edges;
    Graph* master;
public:
    int get_id()
    {
        return unique_id;
    }

    int getChainComponent_id()
    {
        return chainComponent_id;
    }

    void setChainComponent_id(int id)
    {
        chainComponent_id = id;
    }

    int DFS(int, int);

    Vertex(int id, std::vector<int> _edges, Graph* _master)
    {
        unique_id = id;
        edges = _edges;
        master = _master;
        longestChain = 0;
        chainComponent_id = -1;
    }
};

Graph.h :

#pragma once
#include "Vertex.h"
#include <vector>
#include <iostream>
class Vertex;
class Graph
{
    std::vector<Vertex*> vertex;
    int amountOfChainComponents = 0;
public:
    Vertex* getVertex(int id)
    {
        if(id<0 || id>vertex.size())
        {
            return nullptr; //shouldn't be possible with proper input
        }
        return vertex[id];
    }
    int getAmountOfChainComponents()
    {
        return amountOfChainComponents;
    }
    int longestChain()
    {
        int longest = 0;
        for(int i = 0; i < vertex.size(); i++)
        {
            if(vertex[i]->getChainComponent_id() == -1)
            {
                int tmp = vertex[i]->DFS(0, amountOfChainComponents);
                amountOfChainComponents++;
                if(tmp > longest)
                {
                    longest = tmp;
                }
            }
        }
        if(longest == -1)
        {
            std::cout << "There is a chain for every positive integer" << std::endl;
            return -1;
        }
        if(longest < 2)
        {
            std::cout << "There is no chain" << std::endl;
            return 0;
        }

        return longest;

    }
    Graph(std::vector<std::vector<int>> vertices)
    {
        amountOfChainComponents = 0;
        for(int i = 0; i < vertices.size(); i++)
        {
            Vertex* tmp = new Vertex(i, vertices[i], this);
            vertex.push_back(tmp);
        }
    }
    ~Graph()
    {
        while(!vertex.empty())
        {
            delete vertex[vertex.size() - 1];
            vertex.pop_back();
        }
    }
};

Строка Описание серьезности файла Файл 11 Ошибка синтаксической ошибки: отсутствует ';'до '*' c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ vertex.h 34 Ошибка '_master': необъявленный идентификатор c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ vertex.h 11 Ошибкаотсутствует указатель типа - предполагается int.Примечание: C ++ не поддерживает default-int c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ vertex.h 11 Ошибка неожиданного токена (ов), предшествующего ';'c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ vertex.h 30 Ошибка синтаксиса ошибки: идентификатор «График» c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ vertex.h 34 Ошибка «master»: необъявленный идентификатор c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ vertex.h Строка Описание уровня серьезности файла 8 Ошибка 'Vertex': необъявленный идентификатор c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ graph.h

Ошибки, которые появляются после прямого объявления:

Строка серьезности Описание Файл 28 Ошибка при использовании неопределенного типа 'Vertex' c: \ users \ bico \ source \ repos \longestchaingraph \ longestchaingraph \ graph.h 28 Ошибка слева от '-> getChainComponent_id' должна указывать на класс / struct / union / универсальный тип c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ graph.h 30 Ошибка использования неопределенноговведите 'Vertex' c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ graph.h 30 Ошибка слева от '-> DFS' должна указывать на класс / struct / union / genericтип c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ graph.h 57 Ошибка использования неопределенного типа 'Vertex' c: \ users \ bico \ source \ repos \ longestchaingraph \ longestchaingraph \ graph.h

1 Ответ

0 голосов
/ 27 сентября 2018

Это круговая проблема зависимости;два заголовочных файла включают друг друга.

Для обоих случаев будет достаточно только предварительное объявление ;объявить указатель на класс не нужно, чтобы класс был полный тип .

Vertex.h

#pragma once
#include <vector>

class Graph;
class Vertex
{
    int unique_id;
    int longestChain = 0;
    int chainComponent_id;
    std::vector<int> edges;
    Graph* master;
};

График.h

#pragma once
#include <vector>
#include <iostream>

class Vertex;
class Graph
{
    std::vector<Vertex*> vertex;
    int amountOfChainComponents = 0;
};

РЕДАКТИРОВАТЬ

Переместить реализации функций-членов в файлы реализации.например,

Vertex.h

#pragma once
#include <vector>

class Graph;
class Vertex
{
    int unique_id;
    int longestChain = 0;
    int chainComponent_id;
    std::vector<int> edges;
    Graph* master;
public:
    int get_id();
    ...
};

Vertex.cpp

#pragma once
#include "Vertex.h"
#include "Graph.h"

int Vertex::get_id()
{
    return unique_id;
}
...

Graph.h

#pragma once
#include <vector>
#include <iostream>

class Vertex;
class Graph
{
    std::vector<Vertex*> vertex;
    int amountOfChainComponents = 0;
public:
    Vertex* getVertex(int id);
    ...
};

Graph.cpp

#pragma once
#include "Vertex.h"
#include "Graph.h"

Vertex* Graph::getVertex(int id)
{
    if(id<0 || id>vertex.size())
    {
        return nullptr; //shouldn't be possible with proper input
    }
    return vertex[id];
}
...

EDIT2

Как указано @MM, для класса * 1045 достаточно прямого объявленияв Vertex.h.Таким образом, вы можете просто удалить #include "Graph.h" в Vertex.h и зарезервировать #include "Vertex.h" в Graph.h.

...