些许草率罢了 2021-11-26 20:56 采纳率: 100%
浏览 38
已结题

为什么在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];
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 12月5日
  • 已采纳回答 11月27日
  • 创建了问题 11月26日

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示