我有一个名为SparseMatrix的类,它包含一个Cell类型的私有向量 Cell是一种应该保持x,y coords和double值的结构。 另外,我希望一个名为RegMatix的不同类也能够声明一个Cell类型的向量。
这是结构:
struct Cell {
Cell(int row,int col, Number value) {
_cellRow = row;
_cellCol = col;
_val = value;
}
int _cellRow, _cellCol;
Number _val;
};
这是sparseMatrix:
class SparseMatrix {
//second, i tried to place the Cell here, but in RegMatrix.cpp Cell was not recognized.
public:
void Iterator(std::vector<Cell>::const_iterator &startElement,
std::vector<Cell>::const_iterator &endElement) const;
private:
std::vector<Cell> _matrix;
//first i tried to place the struct here, but the above line did not recognize
// Cell. then i placed it above the vector and it worked but RegMatrix.cpp did not recognize it.
};
在RegMatrix.cpp中我希望能够声明:
std::vector<Cell>::const_iterator start,end;
最终我把它放在了课堂边,它工作正常,但这个定义的正确位置是什么? 最后一个问题,如果我希望其他类能够只读结构数据,那么构造Cell的正确结构还是应该创建一个名为Cell的不同类?
对不起,很长的问题,谢谢大家!
答案 0 :(得分:2)
如果您在Cell
内声明SparseMatrix
,则必须将其范围放在SparceMatrix
内。
例如:
std::vector<SparceMatrix::Cell>::const_iterator start,end;
您目前拥有全球范围。
至于最佳位置,如果您只在Cell
中使用SparceMatrix
,我会在那里声明它。
答案 1 :(得分:0)
如何定义一个定义受保护AbstractMatrix
结构的抽象父基类(例如Cell
),然后从{{1}中派生SparseMatrix
和RegMatrix
}。这样,AbstractMatrix
和SparseMatrix
都可以访问RegMatrix
。
要回答您的其他问题,只要您不打算使用多态,结构就可以了。在这种情况下,您需要声明struct属性为private,并为属性实现访问器方法。
答案 2 :(得分:0)
如果只能从SparseMatrix中访问Cell,那么它应该超出它。
答案 3 :(得分:0)
但这是这个定义的正确位置吗?
尽管两个对象(Cell和Matrix)绑在一起,但它们是不同的对象,不需要链接在一起。最多将它们放在同一名称空间中。
请注意,将Cell放入SparceMatrix中:
class SparceMatrix
{
public :
// etc.
class Cell
{
public :
// etc.
} ;
private :
SomePrivateObject m_private ;
} ;
会给Cell带来错误的“力量”。在上面的示例中,Cell将具有对私有m_private对象的公共访问权。
除非您确实需要这样的封装违规,否则请将Cell和SparceMatrix分开。
如果我希望其他类能够只读结构数据,那么构造Cell的正确结构还是应该创建一个名为Cell的不同类?
你需要返回一个consted-cell。
例如,假设您有一个方法将迭代器返回到第一个单元格,应该声明:std::vector<Cell>::const_iterator SparceMatrix::getFirst() ;
这样,用户不应该(除非破坏)修改访问的Cell。
如果要返回某个Cell的引用或指针,也会发生同样的情况:
const Cell & SparceMatrix::getSomeCell() ;
const Cell * SparceMatrix::getSomeOtherCell() ;
Cell SparceMatrix::getSomeAnotherCell() ;
最后一个将返回一个副本,这可能是,也可能不是你想要的。
要访问不可修改的Cell,请考虑const关键字和const迭代器。