簡體   English   中英

用C ++創建結構數組

[英]Creating array of structs in C++

我在C ++中遇到了一個新手問題。
我有一個struct 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一些負值addressess為edge.position (東西我不太了解,它應該剛剛告訴我0x000000 ,也許我只是想象事情)。

總而言之,這是一個重要的教訓,為什么在凌晨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;
}

你在這里工作得很好。 我覺得你忘記的是,當你打電話時

Edge *edges = createEdges(int some_parameters)

edges變量是指向列表中第一個元素的指針。 如果你那么做:

edges[0]

要么:

edges[1]

您會看到這些是不同的值,您現在需要循環訪問該數組。 請記住,在循環期間不要通過數組的末尾。 這就是大多數人說使用向量的原因,因為你可以使用迭代器來使用更多的安全功能。

歡迎來到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;
}

這是一個修改后的版本,它在函數中創建邊,並返回包含所有創建邊的向量。

#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. 邊緣對象的創建和初始化方式(我認為這就是問題)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM