3

我对 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);
            }

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

节点类如下

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();
    }       

};
4

3 回答 3

3

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

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

于 2012-10-23T07:04:55.383 回答
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]越界。您也可以在另一个嵌套循环中使用它。

于 2012-10-23T07:05:43.773 回答
1

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

于 2012-10-23T08:44:42.087 回答