似乎您事先知道矩阵的大小,并且该矩阵是平方的。虽然vector<>
很好,但在这种情况下您也可以使用本机向量。
Item **m = new Item*[ n * n ];
如果要访问位置 r,c,则只需将 r 乘以 n,然后加上 c:
pos = ( r * n ) + c;
因此,如果要访问位置 1、2 和 n = 5,则:
pos = ( 1 * 5 ) + 2;
Item * it = m[ pos ];
此外,除了使用普通指针,您还可以使用智能指针,例如auto_ptr
(obsolete) 和unique_ptr
,它们或多或少相似:一旦它们被销毁,它们就会销毁它们指向的对象。
auto_ptr<Item> m = new auto_ptr<Item>[ n * n ];
唯一的缺点是现在您需要调用get()
才能获取指针。
pos = ( 1 * 5 ) + 2;
Item * it = m[ pos ].get();
在这里,您有一个总结了所有这些的课程:
class ItemsSquaredMatrix {
public:
ItemsSquaredMatrix(unsigned int i): size( i )
{ m = new std::auto_ptr<Item>[ size * size ]; }
~ItemsSquaredMatrix()
{ delete[] m; }
Item * get(unsigned int row, unsigned int col)
{ return m[ translate( row, col ) ].get(); }
const Item * get(unsigned int row, unsigned int col) const
{ return m[ translate( row, col ) ].get(); }
void set(unsigned int row, unsigned int col, Item * it)
{ m[ translate( row, col ) ].reset( it ); }
unsigned int translate(unsigned int row, unsigned int col) const
{ return ( ( row * size ) + col ); }
private:
unsigned int size;
std::auto_ptr<Item> * m;
};
现在您只需要创建类Item
。但是,如果您创建了一个特定的类,那么您必须ItemsSquaredMatrix
为每条新数据进行复制。在 C++ 中对此有一个特定的解决方案,涉及在模板中转换上述类(提示:vector<>
是一个模板)。由于您是初学者,因此将其Item
作为抽象类会更简单:
class Item {
public:
// more things...
virtual std::string toString() const = 0;
};
并派生您将从它们创建的所有数据类。记得做演员,虽然...
如您所见,有很多未解决的问题,并且随着您不断揭开事物的面纱,会提出更多问题。享受!
希望这可以帮助。