0

私は行列プログラムを書いています: 通常の行列 (RegMatrix) を表すクラスと、疎行列 (SparseMatrix) を表すクラスがあります。つまり、非ゼロの値のみを表します。

各 H ファイルの先頭に、反対のクラス宣言を記述します。たとえば、SparseMatrix.h では、クラス RegMatrix を記述します (コンパイラがこのクラスへの参照を認識できるようにするため)。各 cpp ファイルには、両方の H ファイルが含まれています。

私のプログラムはコンパイルされますが、「未解決の外部シンボル..」というリンケージエラーがたくさんあります.

例: 未解決の外部シンボル "public: int__thiscall RegMatrix::getCol(void)const " (?getCol@RegMatrix@@QBEHXZ)" [ファイル: SparseMatrix.obj]

私は自分のコードの何が問題なのかを理解しようとして夢中になっています..

4

2 に答える 2

0

基本的に、これはプログラム内の何かが RegMatrix クラスの getCol を使用していることを意味しますが、コンパイルにはそのようなルーチンの本体が含まれていません。

探すべきこと:

  • そのルーチンの実装を実際に作成しましたか? まったく同じパラメータ プロファイルで?
  • そのルーチンをコンパイルするソース ファイルを、コンパイルしてプログラムにリンクするソース ファイルのリストに追加するのを忘れていませんか? (VisualStudioでは、プロジェクトに追加しましたか?)
  • RegMatrix::ファイルにコーディングしているときに、誤ってルーチン名の先頭をオフのままにしてしまったのではない.cppでしょうか?
于 2010-10-03T11:42:40.400 に答える
0

これは良い設計ではありませんが、ヘッダー ファイルの相互インクルードとは何の関係もありません。定義を忘れたか、タイプミスしました (const修飾子などを忘れました)。その「あまり良くないデザイン」ステートメントについて:明らかに2つのクラスをインターリーブしているため、それらを個別に使用することはできません。RegMatrixとインターリーブせずに a の単体テストをどのように記述しますSparseMatrixか、またはその逆ですか? 2 つの定義を互いに完全に独立させ、両方の行列型を認識する行列型コンバーターの実装を追加することをお勧めします。別の行列タイプを追加する場合は、問題を考慮してください。変換を追加するには、指数関数的な数のファイルを変更する必要があります。最も単純化された設計は次のようになります。

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) { .. }
}  
于 2010-10-03T11:57:21.373 に答える