[英]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;
}
幾乎沒有修改:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.