2012-09-07 16 views
6

To, co chciałbym zrobić:Jak wyskoczyć z bloku kodu C++?

{ 
    ... 
    if(condition) 
     break; 
    ... 
} 

to działa na pętli. Chciałbym czegoś podobnego do prostego bloku kodu. Czy to możliwe?
Czy jestem zmuszony użyć "goto"?


myślę takie rozszerzenie zestawienia break byłby użytecznym dodatkiem do C++ 11 ...

+4

... lub do refaktoryzacji kodu za pomocą większej liczby funkcji atomowych. –

+0

czy możesz podać przykład? –

+1

Jeśli chcesz dodać więcej kodu, możemy zaproponować lepsze rozwiązanie niż przy użyciu goto lub innych sztuczek. – Steed

Odpowiedz

5

Jak o

do 
{ 
    ... 
    if(condition) 
     break; 
    ... 
} 
while (0); 

ja nie szczególnie jak to styl, ale widziałem to już wcześniej. Jeśli refaktoryzacja nie wchodzi w rachubę (może dotyczyć ogromnego bloku, który może przerwać wiele rzeczy, jeśli zostanie zmieniony), jest to opcja.

+5

Jak to jest lepsze niż 'goto'? – MSalters

+5

@MSaltery dla jednego, nie używa 'goto' ... –

+4

@LuchianGrigore Nie wiem, działa, ale w tym przypadku sztuczka jest bardziej myląca niż goto.Przynajmniej z goto wiesz, co się dzieje i dlaczego, z do/while (wyobrażam sobie, że jego kod nie jest krótki), gdy ktoś czyta kod najpierw myśli o pętli, to musi zrozumieć przyczynę jakiegoś czasu (0). –

4

ten jeden:

{ 
    // ... 

    if (!condition) 
    { 
     // ... 
    } 
} 

To pozwoli uniknąć goto wyskoczyć z bloku kodu.

+1

Zgadzam się z tobą, ale w moim przypadku większość kodu musiałaby zostać przeniesiona do następnego bloku if. Stylistycznie byłoby lepiej móc wyskoczyć z bloku, jeśli warunek jest prawdziwy. – Pietro

+0

ya to prosty sposób robienia i ważniejszy jest zrozumiałość twojego kodu niż stylowy. Aby być stylowym, odpowiadającym kodowi Luchiana Grigore'a, nie ma on instrukcji goto. :) –

3

tu tylko pewne dodatkowe możliwości:

for(..) 
{ 
    continue;//next loop iteration 
} 

void mymethod() 
{ 
    ... 
    return; 
    ... 
} 

Prawdopodobnie należy utworzyć sub-metody problematycznej bloku kodu były chcesz użyć goto i opuścić blok kodu przez użycie zwrotu.

+0

Te przypadki nie odpowiadają na pytanie, ponieważ nie są prostymi blokami kodu –

+0

Czasami samo pytanie jest częścią problemu. Re-factoring kodu w celu użycia podprocedury, zamiast pozostawienia bloku kodu prawdopodobnie byłby najczystszym rozwiązaniem. Nie będzie więc już potrzeby opuszczania określonego bloku kodu. – Alex

4

Oto jeden ze sposobów:

switch(0) { 
default: 
    /* code */ 
    if (cond) break; 
    /* code */ 
} 

(proszę nie to zrobić)

+0

świetny pomysł, dlaczego nie, co mogłoby pójść nie tak ... do tego, moja najlepsza odpowiedź byłaby "dla (int i = 0;! I ++;) {...}", ale switch-case nie zawiera zmiennej i wydaje się lepiej. – MetNP

3

W C++ 11 najlepszym sposobem osiągnięcia tego celu jest stosowanie anonimową funkcję lambda i zastąpienie break z return

[&](){ 
    ... 
    if(condition) 
     return; 
    ... 
}(); 

Pamiętaj, że [&] przechwytuje wszystkie zmienne przez odniesienie, jeśli nie używasz żadnego, zamień je na

+1

Nice. Jednak "return" jest mylące, ponieważ to, co ten kod ma zamiar zrobić, to "break". – Pietro

+0

@Pietro Masz rację !. Co więcej, głównym ograniczeniem tej metody jest to, że nie może "zwrócić" w taki sam sposób jak blok. Jeśli potrzebujesz, aby Twój blok powrócił, rozwiązanie 'do chwili 'jest właściwe. –

0

"Chciałbym czegoś podobnego na prosty blok kodu."

Użyj return po spełnieniu warunku, a następnie return kontroluj ponownie dzwoniącego.

void MyWorkerClass::doWork(Item & workItem) { 
    // ... 
    if(noMoreWorkToDo) 
     return; 
    // ... 
}