不同标题中的类不能互相识别?

Хри*_*нов 0 c++ circular-dependency header-files visual-studio-2017

尽管可视化工作室预编译器或其所谓的任何内容都将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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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();
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

行严重性描述文件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错误语法错误:标识符'Graph'c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h 34错误'master' :未声明的标识符c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h行严重性描述文件8错误"顶点":未声明的标识符c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\graph. H

前瞻性声明后出现的错误:

行严重性描述文件28错误使用未定义类型'Vertex'c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 28' - > getChainComponent_id'的错误必须指向class/struct/union/generic键入c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 30错误使用未定义类型'Vertex'c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 30错误' - > DFS'必须指向class/struct/union/generic类型c:\ users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 57错误使用未定义类型'Vertex'c:\ users\bico \源\回购\ longestchaingraph\longestchaingraph\graph.h

son*_*yao 6

这是循环依赖问题; 这两个头文件是相互包含的.

对于这两种情况,只有前瞻性声明就足够了; 声明一个指向类的指针不需要该类是完整类型.

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;
};
Run Code Online (Sandbox Code Playgroud)

Graph.h

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

class Vertex;
class Graph
{
    std::vector<Vertex*> vertex;
    int amountOfChainComponents = 0;
};
Run Code Online (Sandbox Code Playgroud)

编辑

将成员函数的实现移动到实现文件.例如

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();
    ...
};
Run Code Online (Sandbox Code Playgroud)

Vertex.cpp

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

int Vertex::get_id()
{
    return unique_id;
}
...
Run Code Online (Sandbox Code Playgroud)

Graph.h

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

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

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];
}
...
Run Code Online (Sandbox Code Playgroud)

EDIT2

作为@MM指出,向前声明是不够类GraphVertex.h.所以,你可以删除#include "Graph.h"Vertex.h,并储备#include "Vertex.h"Graph.h.

  • @ХристоИванов在您发布的代码中没有提到`getChainComponent_id`,您需要发布真实代码. (2认同)
  • 对于OP,前进的dec不会出现.如果是这种情况,它将是一个完美的重复/sf/ask/43805961/.他们需要将所有实现放在单独的文件中. (2认同)