0

作業中に繰り返しコードがあり、それを取り除きたいので、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?
}

この機能は非常に危険だと思います。コードを改善するにはどうすればよいですか?

4

3 に答える 3

8

ここで行っていることはすでにstd::find()関数によって行われているので、それを使用することをお勧めします(ただし、演​​習のためにこれらのことを自分で実装してみてもかまいません)。

std::find()また、「見つかりません」状態を示す良い方法を示します。アイテムが見つからない場合は、イテレータを最後から1つ返します。このように、呼び出し元は、で返されたイテレータを比較することにより、一致するアイテムが見つかったかどうかを判断できますData.end()

于 2010-06-18T09:32:12.547 に答える
4

あなたが投稿したコードは意味がありません。ある時点ではタイプとして使用Dataし、別の時点ではオブジェクトとして使用します。それがオブジェクトであると仮定すると、何かが見つからないことを示す方法は、その終わりを指すイテレータを返すことです。

return Data.end();

しかし、コードが混乱しすぎて、大きな変更なしにこれを機能させることはできません。

SOに質問を投稿してC++を学ぶつもりはありません。それは、単純に行うことはできません。代わりに、優れたC++の教科書を読む必要があります。イテレータなどを詳細に説明しているAcceleratedC++をお勧めします。このような質問を続けると、単に自分の時間、さらに重要なことに私たちの時間を無駄にしていることになります。

于 2010-06-18T09:40:09.053 に答える
1

あなたがここで何を求めているのかはよくわかりませんが、あなたの投稿にはいくつかの誤解があります。

最初のインライン関数は、まだ気にする必要のない特定の最適化です。最初に通常の機能について学び、それらを正しく理解してください。

別の答えがすでに言ったように、std::find()あなたがやりたいと思われることをします。動作するためにリストのメンバーである必要はありません。実際、最近のC++スタイルガイドは非メンバー関数を好むことがよくあります。

今あなたのコードに。あなたが投稿したコードがC++コードとして機能していないことは間違いありません。そのため、あなたが何をしようとしているのかを理解するのは非常に困難です。使用しているリストタイプもstd::list<>(イテレータの動作が異なります)ではDataなく、変数(コードで定義されていない)とタイプの両方として使用します。

誰かがすでに提案しているように、C ++初心者向けの良い本(「AcceleratedC++」と「ProgrammingP&P using C ++」をお勧めします)をもう少し簡単に、またはもっと良い方法で始めるべきかもしれません。

于 2010-06-18T09:49:26.380 に答える