私は何年にもわたる意味でC ++を手に入れました。現在、他のクラスから使用する単純なマトリックス クラスを実装しようとしています。GManNickG のリードに従って、これが私のものですSimpleMatrix
(「SimpleMatrix.h」で宣言されています):
#pragma once
#include <vector>
template <typename T>
class SimpleMatrix {
unsigned int numCols, numRows;
public:
std::vector<T> data;
SimpleMatrix(unsigned int cols, unsigned int rows) :
numCols(cols),
numRows(rows),
data(numCols * numRows)
{};
T getElement(unsigned int column, unsigned int row);
void setShape(unsigned int column, unsigned int row, const T& initValue);
};
そして(「SimpleMatrix.cpp」で)として実装されます:
#include "SimpleMatrix.h"
template <class T>
T SimpleMatrix<T>::getElement(unsigned int column, unsigned int row) {
return data[row * numCols - 1];
}
template <class T>
void SimpleMatrix<T>::setShape(unsigned int columns, unsigned int rows, const T& initValue) {
numCols = columns;
numRows = rows;
data.assign(columns * rows, initValue);
}
今、SimpleMatrix
fromを使用するmain
と、コンパイル、リンク、および正常に動作します。Container
(「Container.h」で)として宣言されたオブジェクトから使用しようとすると:
#include "SimpleMatrix.h"
class Container {
public:
SimpleMatrix<int> matrix;
Container();
void doStuff();
};
そして(「Container.cpp」で)次のように実装されます:
#include "Container.h"
#include "SimpleMatrix.h"
void Container::doStuff() {
this->matrix.setShape(2, 2, 0);
this->matrix.getElement(1, 1);
}
Xcodeはそれを訴えます
アーキテクチャ x86_64 の未定義のシンボル:
"SimpleMatrix<int>::getElement(unsigned int, unsigned int)", referenced from: Container::doStuff() in Container.o "SimpleMatrix<int>::setShape(unsigned int, unsigned int, int const&)", referenced from: Container::doStuff() in Container.o
ld: アーキテクチャ x86_64 のシンボルが見つかりませんでした。
「Build Phases/Compile Sources」設定を確認しましたが、3 つのファイル (main.cpp、SimpleMatrix.cpp、Container.cpp) がすべてあります。
おそらく、このコードには多くの問題があります。頭に浮かぶのは、 のデフォルト コンストラクターの欠如ですがSimpleMatrix
、それはここで私が実際に懸念していることではありません。2つのケースの根本的な違いが何であるかを理解できません。
どんな助けでも大歓迎です。