本篇日志是作为菜鸟C++学员,写的一篇调试错误的过程,旨在记录自己的学习过程,帮助自己提高,后面附有我的代码。
今天早上在看Essential C++ P125时,想照着书上的例子写一次,看看运行结果。 结果当我抄书上的代码时,一直从书第四章开头找到了P125,原因是书上是按照函数过程这么讲的,造成我抄完代码也不知所以然,结果当然就是编译不通过了。
第一个问题:
当时第一次出现的错误是LNK2001,好像是这个编号,然后我就试,看是不是这里的问题,改一次编译一次,当然这样是没有结果的。最后我想到了百度,百度以后,得到的结果是声明的变量在另一个文件里面找不到。 也就是说这时候才找到问题原因是 class Triangular类中的private 变量 static std::vector<int> _elems在class Triangular里找不到。然后我就改这个问题,第一次是这样改的:在class Triangular的cpp里加上代码 extern _elems;第二次改成extern std::vector<int> _elems; 然后第三次改成std::vector<int> Triangular::_elems; 这时候这个问题才算解决。
收获:
之前看过C++ primer,也看过关于声明,定义这些问题,但之前都只是看书,没有体会,也更没有“一个文件里声明,另一个文件里定义”的这种体会,这次也重新回忆了一下static变量声明时,默认是有extern的,也又学习了一次extern声明和变量定义,还看到了一次一个文件里声明变量,在另一个文件里定义的情况(这里是在.h文件声明一个class的全局vector,在class的cpp文件里定义改vector)
第二个问题:
改完第一个问题后,又出现了第二个问题,在类BaseIterator里重载的operator*() 一直出错,错误类似于上述情况,都是链接时出错。当时情况是抄的书上的代码,一报错,不知道该从哪里下手,然后就找自己感觉像是错的地方,改啊改,还是报错(主要问题是Triangular和BaseIterator里互相调用对方的成员变量,我就这里加一个.h文件,继续报错;那里加一个.h,仍然报错;这里加一个class声明,报错;一直试了好长时间)。最后看着抄的一堆代码,想起了上午调试static变量的过程(调试第一个问题的过程就是单独抛开书上的这个例子,单独建了两个简单的类来做的),重新建了一个工程,然后写一个重载函数,编译一个(主要重载的就是++,这里没有调试*),最后这个测试程序运行正确。然后我就把之前抄的代码里面所有不相干的代码都注视起来,擦,还是报错。。然后,我想了个绝招,,我照着这个测试程序,把抄的程序一行一行注释起来,唯独没有改变类的名字,结果:依然报错。。这次我也不知道问题是哪了。没办法,我就重新建了一个工程EssentialCppP125Again,按照我自己的需要,先写BaseIterator这个类,写一个重载函数,编译一次,,最后成功写到了重载*函数,见到这个*我有点害怕,因为它牵扯到Triangular 类。而Triangular类之前上午写的时候就因为那个static成员变量搞了一上午。所以我就抛开课本上这个Triangular类的定义,只写自己需要的变量和函数(对于课本上的一些测试越界的函数,还有一些赋值等等的函数都省略了)。最后终于调试到了要写*的地方。Triangular类里声明友元函数 friend int BaseIterator::operator*(); 类BaseIterator里定义,又是这个A引用B,B引用A的问题,一下午就被这个问题整过去了,在群里也问了问,群友的回答是:加class Triangular;class BaseIterator;声明和引入对方对象的指针,代码如下:


1 #include<iostream>
2 using namespace std;
3 class A;
4 class B;
5
6 class A
7 {
8 public:
9 B *bb;
10 static int sta;
11 };
12
13 class B
14 {
15 public:
16 A *aa;
17 void p(){cout<<A::sta;}
18 };
19 int main(){
20
21 return 0;
22 }
这个,我还没有测试,先继续我最后的解决方法。我最后是在class BaseIterator里include Triangular.h,全部代码如下:(但这里我还是不懂为什么这样就可以通过,不懂事怎么互相引用的):(按照写的过程贴出所有代码)
1、BaseIterator类
1.1 BaseIterator.h

BaseIterator.h
1 #pragma once
2 #include <iostream>
3 #include <vector>
4
5
6
7
8 class BaseIterator
9 {
10 public:
11 BaseIterator(void);
12 ~BaseIterator(void);
13 public:
14 BaseIterator(int index) : _index(index) {}
15 bool operator==(const BaseIterator& rhs) {return _index == rhs._index;}
16 bool operator!=(const BaseIterator& rhs) {return !(*this == rhs);}
17 BaseIterator& operator++();
18 BaseIterator operator++(int);
19 int operator*();
20
21 int index() {return _index;}
22
23 private:
24 int _index;
25 };