些许草率罢了
2021-11-26 20:56
采纳率: 100%
浏览 27

为什么在main文件中定义的全局变量在类的函数实现文件中访问不到?(使用的VS编程工具)

问题遇到的现象和发生背景

就是照着书上敲代码,然后发现和书上面即使是一样,却发生了bug

问题相关代码,请勿粘贴截图
//头文件
#ifndef MGraph_H        //避免重复包含MGraph.h文件
#define MGraph_H

const int MaxSize = 10;        //图中最多顶点个数

template<class DataType>
class MGraph {
public:
    MGraph(DataType a[], int n, int e);    //构造函数,建立有n个顶点e条边的图
    ~MGraph() {};    //析构函数
    void DFSTraverse(int v);        //深度优先遍历
    void BFSTraverse(int v);        //广度优先遍历
private:
    DataType vertex[MaxSize];    //存放途中顶点的数组
    int arc[MaxSize][MaxSize];    //存放途中边的数组
    int vertexNum, arcNum;        //图的顶点数和边数
};
#endif

//类函数实现类文件:
#include<iostream>        //引入输入输出流
using namespace std;
#include"MGraph.h"        //引入类MGraph的声明


//以下是对类MGraph的成员函数定义
template <class DataType>
MGraph<DataType>::MGraph(DataType a[], int n, int e) {
    int i, j, k;
    vertexNum = n; arcNum = e;
    for (i = 0; i < vertexNum; i++) {    //存储图的顶点信息
        vertex[i] = a[i];
    }
    for(i=0;i<vertexNum;i++)        //初始化边的信息
        for (j = 0; j < vertexNum; j++) {
            arc[i][j] = 0;
        }
    for (k = 0; k < arcNum; k++) {        //存储变得信息
        cout << "请输入边的两个顶点序号:";
        cin >> i >> j;
        arc[i][j] = 1; arc[j][i] = 1;
    }
}

template<class DataType>
void MGraph<DataType>::DFSTraverse(int v) {        //深度优先遍历图
    cout << vertex[v]; visited[v] = 1;
    for (int j = 0; j < vertexNum; j++)
        if (arc[v][j] == 1 && visited[j] == 0)
            DFSTraverse(j);
}

template<class DataType>
void MGraph<DataType>::BFSTraverse(int v)        //广度优先遍历图
{
    int Q[MaxSize];    //假设队列采用顺序存储且不会发生溢出
    int front = -1, rear = -1;        //初始化队列
    cout << vertex[v]; visited[v] = 1; Q[++rear] = v;        //被访问点入队
    while (front != rear) {
        v = Q[++front];
        for (int j = 0; j < vertexNum;j++) {
            if (arc[v][j] == 1 && visited[j] == 0) {
                cout << vertex[j]; visited[j]=1; Q[++rear] = j;
            }
        }
    }
}
//main函数文件
#include<iostream>        //引入输入输出流
using namespace std;
#include"MGraph.cpp"        //引入类MGraph的成员函数定义

 int visited[MaxSize];

//以下是主函数
int main() {
    char ch[] = {'A','B','C','D','E'};    //定点信息
    MGraph<char> MG(ch, 5, 6);    //图中顶点信息是char型
    for (int i = 0; i < MaxSize;i++) {    //初始化图中所有顶点均未被访问
        visited[i] = 0;
    }
    cout << "深度优先遍历序列是:";
    MG.DFSTraverse(0);    //从顶点0出发进行深度优先遍历图
    cout << endl;
    for (int i = 0; i < MaxSize;i++) {        //初始化途中所有顶点均未被访问
        visited[i] = 0;
    }
    cout << "广度优先遍历序列是:";
    MG.BFSTraverse(0);    //从顶点0出发广度优先遍历图
    cout << endl;
    return 0;
}


运行结果及报错内容

img

我的解答思路和尝试过的方法

使用过将沈明visited放到函数实现类文件的头部,但是出现了其他bug,说是以及有声明了

我想要达到的结果

解决这visited问题

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • 已采纳

    main函数文件中的int visited[MaxSize];这一句注释掉。
    然后把 int visited[MaxSize];放在.h文件中(const int MaxSize = 10; 这一句下面),前面加extern就可以了

    
    extern  int visited[MaxSize];
    
    评论
    解决 1 无用
    打赏 举报 编辑记录

相关推荐 更多相似问题