在类中定义结构的正确方法是什么?

时间:2010-09-24 11:52:56

标签: c++

我有一个名为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的不同类?

对不起,很长的问题,谢谢大家!

4 个答案:

答案 0 :(得分:2)

如果您在Cell内声明SparseMatrix,则必须将其范围放在SparceMatrix内。

例如:

std::vector<SparceMatrix::Cell>::const_iterator start,end;

您目前拥有全球范围。

至于最佳位置,如果您只在Cell中使用SparceMatrix,我会在那里声明它。

答案 1 :(得分:0)

如何定义一个定义受保护AbstractMatrix结构的抽象父基类(例如Cell),然后从{{1}中派生SparseMatrixRegMatrix }。这样,AbstractMatrixSparseMatrix都可以访问RegMatrix

要回答您的其他问题,只要您不打算使用多态,结构就可以了。在这种情况下,您需要声明struct属性为private,并为属性实现访问器方法。

答案 2 :(得分:0)

如果只能从SparseMatrix中访问Cell,那么它应该超出它。

答案 3 :(得分:0)

放置Cell的位置?

  

但这是这个定义的正确位置吗?

尽管两个对象(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迭代器。