6

我在 C++ 中有一个新手问题。
我有一个Edge定义如下的结构:

struct Edge {
    int position[4];
    int average;
};

现在我需要创建很多这样的结构,并为此创建了一个辅助方法,它根据一些参数创建这些结构的数组:

Edge* createEdges(int some_parameters){
    Edge *edges = new Edge[8];

    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1; //fill the rest of the edge array in the same manner
        edge.average = 10;

        edges[i] = edge;
    }

    return edges;
}

但是,当我现在打电话时:Edge *edges = createEdges(int some_parameters)Edge 数组中没有合理的数据(超出范围?)。

我想我在这里混合了一些东西,但如果我可以在不诉诸数据结构的情况下完成这项工作,我会更喜欢vector。这是处理这个问题的正常方式还是我应该自己声明边缘数组并将其传递给辅助方法来填充它?

编辑:

首先,我要感谢大家的评论/提示/提示/建议/......他们帮助我找到了我很容易忽略的问题。
在我看到代码应该可以工作的回复之后,我也测试了简化的代码(我应该在第一个地方做的事情),令人惊讶的是,它工作了!因此,我检查了为什么我的真实代码不起作用而简化版本起作用。
我的真实代码如下所示:

Edge* createEdges(int some_parameters){
     Edge* edges = new Edge[8];
     if(some_parameter != 0){
          //create the edges as in my 1st snippet
          return NULL; //doh, should return edges here !
     } else { 
          return NULL;
     }
}

我没有看到我只是返回错误值(NULL)的原因是因为调试器向我显示了一些0xf6f6f6带有一些负值的地址edge.position(我不太明白,它应该只是显示给我0x000000,也许我是只是想象事物)。

总而言之,这是一个重要的教训,为什么在凌晨 3 点之后永远不要编码,不会有任何好处!

4

4 回答 4

3

这是 C++ 使用std::vector

std::vector<Edge> createEdges(int some_parameters){
    std::vector<Edge> edges;

    for(int i = 0 ; i < 8; i++){
        Edge edge;
        edge.position[0] = 1;
        edge.average = 10;
        edges.push_back(edge);
    }

    return edges;
}
于 2012-10-24T13:07:52.757 回答
2

你在这里的工作正常。我觉得你忘记的是,当你打电话时

Edge *edges = createEdges(int some_parameters)

该边缘变量是指向列表中第一个元素的指针。如果你要这样做:

edges[0]

或者:

edges[1]

您会看到这些是不同的值,您现在需要循环访问数组。请记住,您不会在循环期间通过数组的末尾。这就是大多数人说使用向量的原因,因为您可以通过迭代器使用更多的安全功能。

于 2012-10-24T13:19:31.950 回答
2

欢迎使用 C++!用于创建类实例(C++ 中的结构是所有字段都是公共的类)的辅助方法称为构造函数。下面是我如何使用构造函数创建边缘类的实例。

class Edge {
public:
    int position[4];
    int average;
    Edge();
};

Edge::Edge() //constructor
{
    position[0] = 1;//fill the rest of the edge array in the same manner
    average = 10;
}

int main()
{
    Edge* myEdge = new Edge(); //constructor called
    Edge* myEdges[8];
    for (int i = 0; i < 8; i++)
    {
        myEdges[i] = new Edge();
    }
    return 0;
}
于 2012-10-24T13:19:44.450 回答
1

这是一个稍微修改的版本,它在函数中创建边,并返回一个包含所有创建边的向量。

#include <iostream>
#include <vector>

struct Edge {
    int position[4];
    int average;
};

std::vector< Edge > createEdges(int some_parameters){
    std::vector< Edge > edges( 8 );

    for(int i = 0 ; i < 8; i++){
        const Edge edge{ { 1, 0, 0, 0 }, 10 };

        edges[i] = edge;
    }

    return edges;
}


int main()
{
    auto e( createEdges(5));

    std::cout<<e[0].average<<std::endl;
}

有一些修改:

  1. 我没有分配边数组并返回指针,而是返回向量
  2. 创建和初始化边缘对象的方式(我认为这是所要求的)
于 2012-10-24T13:16:14.373 回答