基于2020年10月学期 Object-Oriented Programming 课程 MerkelBot 自动货币交易机的项目,以下列出我遇到过的错误报告及处理方法。
Visual Studio 2019
空屏
等一会儿……项目太大,打开中……
LNK2019 无法解析的外部符号
Solution: 查找 class 中的 static object 是否已在.cpp file中初始化。Define static vectors in .cpp file outside of any of the member functions, bugs disappear.
非静态成员引用必须与特定对象相对
Solution: Make those member functions to be static.
或者建这个 class 的 instantiation 然后使用这个类的实例,而非使用这个类。
注意,使用类时用:: 使用类的实例时用.
MerkelMain::wallet
merkelMain.wallet
C2597 对非静态成员xxx的非法引用
Solution: pass an instance of the class.
Debug assertion failed! Vector subscript out of range
Solution: 检查vector是不是有使用还没存在的那个下标元素的情况,比如输出V[1]但是还没存这个值。
检查是否正确使用了 vector 中的 functions,比如是不是把 vector 当成了array 使用?是不是要使用push_back, erase等等functions?
Debug error! abort() has been called
在自己新写的那段代码前后都加 std::cout 用文字说明,并打出每个变量的当前值,就可以根据运行时卡住的位置定位出错的位置行。
vector out of range
检查 vector 的赋值情况
double endMinusOne = expSmoothInstan.vecStoreActual.at(expSmoothInstan.vecStoreActual.back()-1);
查这个 -1 的位置是不是还是空的?是不是-2?
其实还是错的,因为应该写
vec.at(vec.size()-2)
at 后面括号里应该跟一个数,因为它代表一个位置。如果用back岂不是用了最后存的那个数减一当成访问位置了?
Debug Assersion Failed! back() called on empty vector
看看如果写的是 back()-10,那这个位置有元素吗?是不是总共才存了9个数?那应该是 back()-9 才对。
再查是不是应该写 vec.at(vec.size()-10)
如何得到map中第二列存的东西
正确写法:
double money = merkelMain.wallet.currencies.at(“DOGE”);
这里,Wallet wallet 这个object是MerkelMain 这个class里的一个成员,而merkelMain是MerkelMain 这个class的instantiation. 在Wallet这个class中有一个数据类型为map的成员叫 currencies,我要得到其中key为 ”DOGE” 的第二列那个值。说白了,我要知道我钱包里 DOGE 这个币种有多少钱。
C2676: 二进制不定义该运算符或到预定义运算符可接收的类型的转换
这个怎么解决的来着……
C3646: 未知重写说明符
定位到 .h 文件中 class 里的一个成员。
原因是两个 .h 文件相互 #include,即你引用我,我也引用你。解决办法:在一个 .h 文件中删掉 #include 然后在其 .cpp 文件中#include它。