类不同headers不认识对方?
Classes in different headers do not recognize each other?
即使 visual studio pre-compiler 或其他名称将 Graph 识别为来自不同 header 的 class,但在构建后我得到最荒谬的错误作为如果我以前从未提到过其他 header。首先我没有向前声明两个 classes 并且下面的第一组错误来自于此,但是后来我尝试向前声明并且有与 classes 本身的结构相关的类似错误。使用来自另一个 class 的函数生成它们,这表明 header 文件什么都不做。他们不知道彼此的功能,我也不知道为什么。
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();
}
}
};
Line Severity Description File 11 Error syntax error: missing ';'
before
'*' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h
34 Error '_master': undeclared
identifier c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h
11 Error missing type specifier - int assumed. Note: C++ does not
support
default-int c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h
11 Error unexpected token(s) preceding
';' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h
30 Error syntax error: identifier
'Graph' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h
34 Error 'master': undeclared
identifier c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h
Line Severity Description File
8 Error 'Vertex': undeclared
identifier c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
前向声明后出现的错误:
Line Severity Description File 28 Error use of undefined type
'Vertex' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
28 Error left of '->getChainComponent_id' must point to
class/struct/union/generic
type c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
30 Error use of undefined type
'Vertex' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
30 Error left of '->DFS' must point to class/struct/union/generic
type c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
57 Error use of undefined type
'Vertex' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
这是一个循环依赖问题;这两个头文件相互包含。
对于这两种情况,只有 forward declaration will be enough; declare a pointer to class doesn't need the class to be complete type.
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;
};
Graph.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];
}
...
编辑2
正如@M.M 所指出的,前向声明对于 Vertex.h
中的 class Graph
就足够了。所以你可以只删除 Vertex.h
中的 #include "Graph.h"
,并保留 Graph.h
中的 #include "Vertex.h"
。
即使 visual studio pre-compiler 或其他名称将 Graph 识别为来自不同 header 的 class,但在构建后我得到最荒谬的错误作为如果我以前从未提到过其他 header。首先我没有向前声明两个 classes 并且下面的第一组错误来自于此,但是后来我尝试向前声明并且有与 classes 本身的结构相关的类似错误。使用来自另一个 class 的函数生成它们,这表明 header 文件什么都不做。他们不知道彼此的功能,我也不知道为什么。
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();
}
}
};
Line Severity Description File 11 Error syntax error: missing ';' before '*' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h 34 Error '_master': undeclared identifier c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h 11 Error missing type specifier - int assumed. Note: C++ does not support default-int c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h 11 Error unexpected token(s) preceding ';' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h 30 Error syntax error: identifier 'Graph' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h 34 Error 'master': undeclared identifier c:\users\bico\source\repos\longestchaingraph\longestchaingraph\vertex.h Line Severity Description File 8 Error 'Vertex': undeclared identifier c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
前向声明后出现的错误:
Line Severity Description File 28 Error use of undefined type 'Vertex' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 28 Error left of '->getChainComponent_id' must point to class/struct/union/generic type c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 30 Error use of undefined type 'Vertex' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 30 Error left of '->DFS' must point to class/struct/union/generic type c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h 57 Error use of undefined type 'Vertex' c:\users\bico\source\repos\longestchaingraph\longestchaingraph\graph.h
这是一个循环依赖问题;这两个头文件相互包含。
对于这两种情况,只有 forward declaration will be enough; declare a pointer to class doesn't need the class to be complete type.
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;
};
Graph.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];
}
...
编辑2
正如@M.M 所指出的,前向声明对于 Vertex.h
中的 class Graph
就足够了。所以你可以只删除 Vertex.h
中的 #include "Graph.h"
,并保留 Graph.h
中的 #include "Vertex.h"
。