2013-10-20 43 views
0

我想要編寫一個循環,通過一個從鄰居到鄰居的某個函數迭代的同一個結構的幾個實例(在我的情況下命名爲edg),直到它返回一個表示STOP的元素。我試着用NULL返回它,但它不起作用。我可以使用什麼?我可以使用什麼作爲NULL結構?

下面是一些代碼可能更準確地解釋它比我以前的話: 我的結構:

struct edg{ 
int i,j,k; 
edg(int a, int b, int c){ 
i = a; j = b; k = c; //I'm adding a constructor to it 
} 
} 

我的迭代函數:

edg neighbour(edg temp){ 
if(temp satisfies certain criterias){ return edg(new coordinates);} 
else{ return NULL;} 
} 

我的循環:

while(my_edg!=NULL){ 
my_edg = neighbour(my_edg); 
} 

我想我可以選擇edg的某個值,將其定義爲rej並在我的循環中替換:

while(my_edg!=edg_marked_as_rejection) 

但是有沒有另外一種方法呢?

+1

有'提升: :optional'。 – chris

+2

「我試着用NULL返回它,但它不起作用。」 - 爲了工作(編譯!),你必須返回一個指針。 –

+0

[是由C++標準定義的空結構?](http://stackoverflow.com/questions/16666871/is-empty-struct-defined-by-c-standard) –

回答

2

需要注意的是你的函數:

edg neighbour(edg temp){ 
    if(temp satisfies certain criterias){ return edg(new coordinates); } 
    else{ return NULL; } 
} 

按值返回edg實例從而試圖return NULL;是無效的(除非您已經定義了一些自定義的轉換)。 NULL是一個可能的值傳遞/由指針返回,在此情況下可能意味着改變該函數的原型時:

edg* neighbour(edg temp) { ... } 

然而基於所述語義它會更合理地或者通過參考和返回通一個標誌,指示成功:

bool neighbour(const edg& temp, edg& result) { 
    if (...) { 
     result = ...; 
     return true; 
    } 
    return false; 
} 

或者如果你的病情if(temp satisfies certain criterias)應該在大多數情況下滿足這些條件得不到滿足是相當的出色的狀態,您也可以考慮拋出異常(而不是返回NULL)。

第三種選擇可能會實現空對象設計模式,這意味着的edg標記爲「無效」的情況下將被修建和返回,調用者會做這樣的事情:

edg n = neighbour(tmp); 
if (!n.isValid()) { 
    ... 
} 
相關問題