我正在编写一个Matrix程序:我有一个表示一个Regular矩阵(RegMatrix)的类,以及一个表示稀疏矩阵(SparseMatrix)的类,即:仅表示非零值。
在每个H文件的开头,我写了相反的类声明。例如,在SparseMatrix.h中我编写了类RegMatrix(这样编译器就会识别我对这个类的引用)。在每个cpp文件中,我都包含两个H文件。
我的程序编译,但我有很多连锁错误,说“未解析的外部符号..”
例如: 未解析的外部符号“public:int__thiscall RegMatrix :: getCol(void)const”(?getCol @ RegMatrix @@ QBEHXZ)“[file:SparseMatrix.obj]
我很想弄清楚我的代码出了什么问题..
答案 0 :(得分:0)
基本上,这意味着程序中的某些东西正在使用RegMatrix类中的getCol,但是你的编译不包括这种例程的正文。
要寻找的东西:
RegMatrix::
文件中编码时,您是否意外地将.cpp
从常规名称的前面移开了?答案 1 :(得分:0)
这与头文件的相互包含无关,尽管这不是一个好的设计。你忘了或错误地输入了这个定义(忘了一些const
限定符或类似的东西)。关于“不太好的设计”声明:你显然交错了两个类,因此它们不能独立使用。如何在不与RegMatrix
交错的情况下为SparseMatrix
编写单元测试,反之亦然?我建议使两个定义完全相互独立,并添加一个知道两种矩阵类型的矩阵类型转换器实现。如果您决定添加其他矩阵类型,请考虑这些问题:您必须修改指数数量的文件,才能添加转换。大多数简化设计看起来像:
regmatrix.h:
class RegMatrix {
// stuff, no mention of SparseMatrix
};
sparsematrix.h:
class SparseMatrix {
// stuff, no mention of RegMatrix
};
conversions.cpp :(带有conversions.h中的声明)
#include "sparsematrix.h"
#include "regmatrix.h"
#include "uppertriangular.h" // got it?
//...
namespace Conversions {
void SparseToRegular(SparseMatrix& pTo, const RegMatrix& pFrom) { .. }
void RegularToSparse(RegMatrix& pTo, const SparseMatrix& pFrom) { .. }
}