2012-04-30 4 views
0

Итак, я создал связанный список, который содержит ССЫЛКИ для созданных объектов класса.Значения по умолчанию для ссылки, C++

Я хочу сделать метод, который ищет в связанном списке и возвращает ссылку на const для объекта, если он существует, или если объект не существует, возвращает НЕКОТОРЫЕ ЗНАЧЕНИЯ.

которое значение должно быть? если бы это было int, я бы вернулся 0, если бы это был указатель, я бы вернул NULL ....

const Node& NodeList::NodeNumSearch(int num) const 
{ 
    Member *TempHead=MemberHead; 
    while(TempHead!=NULL) 
    { 
     if(TempHead->GetNode().getNum() == num) 
      return TempHead->GetNode(); 
     TempHead=TempHead->GetNext(); 
    } 

    return ???; 
} 

P.S. Объект Member является членом связанного списка. а объект Node - это значение в объектах-членах связанного списка.

+4

Вы можете «выбросить» исключение. Вы можете вернуть ссылку на статический семантически нулевой «узел». Вы можете использовать Boost.Optional. То, что вы никогда не должны делать, это «return * (Node *) 0'. –

+0

Или верните указатель вместо этого и используйте nullptr, или верните итератор, и используйте один-проходной конец, чтобы сигнал «не был найден». –

+2

Ссылки просто не подходят для этого. –

ответ

4

Либо throw Исключение в этом случае, либо вместо этого вы можете заменить свою функцию указателем. Там просто нет разумного способа вернуть «пустую» ссылку здесь.

В качестве альтернативы возьмите стандартный подход к библиотеке и верните прокси-интерпретатор по-своему по значению, и вы можете проверить его на end.

0

Я думаю, что в C/C++, как правило, вы передаете указатель для хранения результата и фактически возвращаете значение, основанное на том, работала ли функция. Кроме того, вы должны исключить исключение, если оно не работает, а не возвращает объект по умолчанию. Возвращайте значения по умолчанию только в том случае, если вы ожидаете, что этот по умолчанию используется другим кодом - для поиска, который кажется маловероятным.

// Inject Node pointer to hold the reference 
// Returns 1 if it worked, 0 otherwise 
const int NodeList::NodeNumSearch(int num, Node* node) const 
{ 
    //your code here 
} 
+0

Это будет способ C, но обычно не используется в C++, где существуют другие методы, такие как исключения. –

+0

Достаточно честный. Я поклонник исключений, но в основном использовал их в Java. –

2

Вы можете определить свой собственный NullNode как статический член var и вернуть его.

// header 
class NodeList 
{ 
    ..... 

    static Node k_NullNode; 
}; 


// cpp 
/* static */ Node NodeList::k_NullNode; // you might need to pass a special argument to make it different from normal nodes. 

const Node& NodeList::NodeNumSearch(int num) const 
{ 
    .... 

    return k_NullNode; 
} 

// test 
void test() 
{ 
    const Node& ret = NodeNumSearch(0); 
    if(ret == NodeList::k_NullNode) // you might need to override == operator. 
    { 
     // failed to search.. 
    } 
    else 
    { 
     // succeeded.. 
    } 
} 
Смежные вопросы