我对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();
}
};
答案 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循环,这可能会产生问题。