获得类变量的错误值

时间:2012-10-23 06:59:24

标签: c++ class

我对c ++很新。实际上我正在将我的代码从c#转换为c ++。我的代码的问题是我得到了某个类变量的默认值,即使我已经将它设置为其他值。部分代码如下。请帮忙。节点和单元格是类。

node nodes [10];
cell cells [10][10];
for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            {
                cell c1;                    
                cells[i][j] = c1;
            }   

// mapping nodes to cells 
        for (i = 0; i < N; i++)
        {
            nodes[i] = node(i); 
            // depending upon some x and y, nodes are assigned to appropriate cells.            
            cellNodeCount = cells[x][y].appendNode(nodes[i]);                               
        }

现在在同一个类的后面的代码中,我正在更新节点的标志。

for (i = 0; i < n; i++)
            for (j = 0; j < n; j++)
            { 
               cellNodeList = cells[i][j].getNodeList();

               //for some p
               cellNodeList[p].setNodeFlag(true);
            }

稍后,当我尝试访问节点标志时,我总是得到假,即0,即使该节点的标志设置为真。

节点类如下

class node
{
private:
     int nodeID;    
     bool Flag;

public:
    node(void){}
     ...

    void setNodeFlag(bool nodeFlag)
    {
        Flag = nodeFlag;
    }

    bool getNodeFlag()
    {
        return Flag;
    }     
};

这是包含getNodeList()函数的单元格类。

class cell
{
private:        
vector<node> nodeList;

public:

    int appendNode(node nod)
    {            
        nodeList.push_back(nod);           
        return nodeList.size();
    }



vector<node> getNodeList()
    {
        return nodeList;
    }

    int cellNodeCount()
    {
        return nodeList.size();
    }       

};

3 个答案:

答案 0 :(得分:3)

猜测但是我只有一个答案。设置节点标志时,您将其设置在节点的副本上,而不是您认为正在设置它的原始节点上。记住C#和C ++之间的巨大差异。在C#中,您的类变量是对基础对象的引用,当您指定要复制引用而不是对象的变量时。在C ++中则相反,您的类变量是实际对象,当您将一个变量分配给另一个变量时,您将复制实际对象。这有时称为值语义(C ++)vs 引用语义(C#和Java)。

如何修复它是不可能从您发布的代码中说出来的。但是你需要用指针或引用做一些事情。可能您的方法getNodeList正在复制节点列表,而不是返回对现有节点列表的引用。

答案 1 :(得分:1)

这些循环看起来可能会产生问题:

for (i = 0; i < n; i++)
    for (j = 0; j < n; j++)
    {
        cell c1;                    
        cells[i][j] = c1;
    }   

虽然您没有显示n的值,但您可以将它用于两个循环。这意味着如果n为10(cells数组的外部维度),那么您将访问cells[i][j]越界。您也可以在其他嵌套循环中使用它。

答案 2 :(得分:1)

我建议交叉检查double for循环,这可能会产生问题。