как избежать повторения кода? - PullRequest
0 голосов
/ 18 июня 2010

У меня есть некоторый технический вопрос, у меня есть повторяющийся код в моей работе, и я хочу избавиться от него, поэтому я знаю, что в C ++ не очень хорошая идея использовать макрос, но вместо этого я должен использовать встроенную функцию,было бы неплохо использовать эту функцию как встроенную:

list<Data>::iterator foo(int data){
if(dataExists(data)){
    list<Data>::iterator i;
    for(i = dataClass.begin(); i != dataClass.end(); ++i){
       if(i->getData() == data){
        break;
       }
return i;   //here I have one more problem, what can I return if data doesn't exist?
}

Я новичок, и я думаю, что эта функция очень небезопасна, может кто-нибудь дать мне совет, как я могу улучшить свой код, спасибо вadvance

PS Что вы обычно используете, чтобы избежать повторения кода?

Я редактировал код

Ответы [ 3 ]

8 голосов
/ 18 июня 2010

То, что вы здесь делаете, уже сделано с помощью функции std::find(), поэтому было бы лучше использовать это (хотя, конечно, можно попробовать реализовать эти вещи самостоятельно для упражнения).

std::find() также демонстрирует хороший способ указать условие «не найден» - если элемент не найден, он возвращает итератор один за другим.Таким образом, вызывающая сторона может определить, был ли найден соответствующий элемент, сравнивая возвращенный итератор с Data.end().

4 голосов
/ 18 июня 2010

Код, который вы разместили, не имеет смысла. в одной точке вы используете Data как тип, а в другой - как объект. Предполагая, что это объект, способ указать, что что-то не найдено, - это вернуть итератор, указывающий на его конец.

return Data.end();

но ваш код слишком запутан, чтобы это работало без серьезных изменений.

Вы не собираетесь изучать C ++, публикуя вопросы по SO - это просто невозможно сделать. Вместо этого вам нужно прочитать хороший учебник по C ++ - я рекомендую Accelerated C ++ , который подробно описывает такие вещи, как итераторы. Если вы продолжаете задавать подобные вопросы, вы просто теряете свое время и, что более важно, наше.

1 голос
/ 18 июня 2010

Я действительно не знаю, что вы спрашиваете здесь, но в вашем посте есть несколько заблуждений.

Первые встроенные функции - это особая оптимизация, о которой вам пока не нужно заботиться. Сначала узнайте о нормальных функциях и поймите их правильно.

Как уже сказал другой ответ, std::find() делает то, что вы, кажется, хотите сделать. Он не должен быть членом списка, чтобы работать, на самом деле современные руководства по стилю C ++ часто предпочитают функции, не являющиеся членами.

Теперь к вашему коду. Я совершенно уверен, что код, который вы разместили, не работает на C ++, что делает очень трудным понимание того, что вы пытаетесь сделать. Тип списка, который вы используете, также не является std::list<> (итераторы работают по-другому), и вы используете Data как переменную (которая не определена в вашем коде) и как тип.

Как уже говорил кто-то, возможно, вам следует начать немного проще, или еще лучше, получить хорошую книгу (я рекомендую "Ускоренный C ++" и "Программирование P & P с использованием C ++") для начинающих C ++.

...