0

我正在编写一个矩阵程序:我有一个表示正则矩阵 (RegMatrix) 的类和一个表示稀疏矩阵 (SparseMatrix) 的类,即:仅表示非零值。

在每个 H 文件的开头,我编写了相反的类声明。例如,在 SparseMatrix.h 中,我编写了 RegMatrix 类(以便编译器识别我对此类的引用)。在每个 cpp 文件中,我都包含两个 H 文件。

我的程序可以编译,但我有很多链接错误,说“未解析的外部符号..”

例如:未解析的外部符号 "public: int__thiscall RegMatrix::getCol(void)const " (?getCol@RegMatrix@@QBEHXZ)" [file: SparseMatrix.obj]

我要疯了,想弄清楚我的代码出了什么问题。

4

2 回答 2

0

基本上,这意味着您的程序中的某些内容正在使用 RegMatrix 类中的 getCol,但您的编译不包括此类例程的主体。

要寻找的东西:

  • 您是否真的创建了该例程的实现?使用完全相同的参数配置文件?
  • 您是否忘记将编译该例程的源文件添加到要编译并链接到程序的源文件列表中?(在 VisualStudio 中,您是否将其添加到项目中?)
  • 当您将例程名称编码到文件中时,您是否可能不小心把它RegMatrix::放在了前面.cpp
于 2010-10-03T11:42:40.400 回答
0

这与头文件的相互包含无关,尽管这不是一个好的设计。您忘记或打错了定义(忘记了一些const限定符或类似的东西)。关于“不太好的设计”声明:您显然已经交错了两个类,因此它们不能独立使用。您如何为 a 编写单元测试RegMatrix而不与 交错SparseMatrix,反之亦然?我建议使这两个定义完全相互独立,并添加一个知道两种矩阵类型的矩阵类型转换器实现。如果您决定添加其他矩阵类型,请考虑问题:您将不得不修改指数数量的文件以添加转换。对于最简单的设计,可能看起来像:

regmatrix.h:

class RegMatrix {
 // stuff, no mention of 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) { .. }
}  
于 2010-10-03T11:57:21.373 回答