2013-08-04 156 views
4

有沒有辦法做我想做的事情,而不使用指針或引用?有沒有辦法返回null而不是自定義對象(不是指針)?

下面的代碼:

Node getSmallest() { 

    if (openList.empty()) 
     return 0;   // syntax error 

    // some other code 
} 
+0

節點是類還是typedef?讓你的問題更加清楚,好吧,0不是節點,所以報錯 –

+0

節點是一個類 – Oleksiy

+4

除非有一個值'節點'可以把它代表null。您可以返回一個可選對象(例如'boost :: optional ') – juanchopanza

回答

3

看起來您想要在代碼成功時返回Node對象的副本。

struct Node{ 
    int a; 
    bool isEmpty_; 
    Node(bool isEmpty):isEmpty_(isEmpty) 
}; 

Node getSmallest() { 

    if (openList.empty()) 
     return Node(false); 

    // some other code 
} 

沒有別的辦法,你必須返回一個對象,其內部可以有一個isEmpty標誌設置,以表示該錯誤。

+1

我建議避免使用'isEmpty_'成員,並使用'boost :: optional '進行操作。這樣你可以避免混淆你的類邏輯。 –

6

是。你可以拋出異常。

+0

同意。試圖獲得空集的最小元素不是預期的情況,沒有合理的對象返回,所以異常實際上是最好的出路。 – MSalters

7

您可以使用boost::optional返回一個可選值。或者等待C++ 14並使用std::optional

+2

爲什麼要等待?你很容易實現自己。 – Nawaz

2

getSmallest()函數的返回類型被定義爲一個Node對象,它在C++中意味着 返回的表達式必須是Node類型,並且在運行時返回的對象的內存將被複制回調用方。

因爲,你不能返回整數0

你能做什麼,而是被定義節點特定實例對象,它表示一個空節點。這主要取決於節點的定義,假設如下:

class Node { 
    // Some representative field 
    int a; 

    // Some basic constructor 
    Node(int a){ 
     this->a = a; 
    } 
} 

可以在類似的方式定義一個空節點:

class Node { 
    // Some representative field 
    int a; 

    // Some basic constructor 
    Node(int a){ 
     this->a = a; 
    } 

    static Node NULL_NODE(-1); 
} 

上面的例子假設你實際上從未指派字段a其他節點對象中的值爲-1。如果-1不符合你的目的,你可以選擇一個你認爲永不使用的值。 如果節點中有多個字段,則可以用值的組合來表示NULL_NODE。

編輯:正如innosam指出的,你也可以(也可能更好)添加一個布爾字段到節點類來表示節點是否爲NULL或任一。

通過上面說的,你現在就可以實現你的功能是這樣的:

Node getSmallest() { 

    if (openList.empty()) 
     return Node.NULL_NODE;   // syntax error 

    // some other code 
} 

否則,您可以使用第三方工具,可以讓你做同樣的事情。 請參閱其他人對此案例的回答。

相關問題