1

文字列を int に変換できるユーティリティをプログラムに記述したいと考えています。atoi または strtol を使用できることはわかっていますが、エラー処理が必要です。それを行うより良い方法はどれですか?おそらく特定の名前空間でのみ、単純なグローバル関数を作成するか、それを実行できるメンバーを持つクラスを作成する必要がありますか?

例:

    namespace utility{

        int ConvertStrToInt(std::string* str, int& convertednum)
        {
          //do the conversion and error handling
        return convertednum;
        }
    }

また

    class Utility{
    public:
        static int ConvertStrToInt(std::string* str, int& convertednum)
        {//do the conversion and error handling here} 
    }

質問が少しばかげているように聞こえる場合は申し訳ありませんが、私は他に 2 人の男性とチームを組んでおり、これについては非常に異なった考え方をしています。1 は、クラスはすべてのものであり、クラスはすべてのものであると言っています。このような単純な問題には、単純な関数が良い解決策であると思います。

では、どちらがより効率的ですか?いつ単純な関数を使用する必要があり、クラスが適切な解決策になるのはいつですか?

みんなにとってThx!

4

5 に答える 5

5

Utility上記で書き留めたクラスは、メソッドがクラスのメンバーを使用も依存もしないため、オブジェクト指向プログラミングの背後にある考え方と矛盾しています。クラスは、特定のプロパティとこれらのプロパティのメソッドを持つオブジェクトであるべきです。

于 2012-08-08T08:04:25.673 に答える
2

変換に状態があると便利な場合は、クラスを使用してください。できれば、呼び出し可能なエンティティとしてインスタンスを渡すことができるファンクター。状態がない場合は、関数を使用します。

余談ですが、署名と戻り値の型はおそらく次のようになります。

int ConvertStrToInt(const std::string& str);

この特定の例に関して編集します。C++ 標準ライブラリは既にこの機能を提供しているため、再実装する必要はありません。

于 2012-08-08T08:03:36.200 に答える
1

namespaceこれについては通常の方法です。

クラス内の関数はとにかく宣言する必要があり、static関数をグループ化するためだけにクラスを作成することはお勧めできません。

于 2012-08-08T08:03:10.950 に答える
0

ない。関数オブジェクト ( Functorと呼ばれることもあります) を探します。

struct str_to_int {
  int operator()(const std::string& s) const { return 23; }
};

なんで?これにより、必要に応じて状態を追加できます。すべての標準アルゴリズム機能とすべての最新の C++ ライブラリで動作します。ユーザーが気付かないうちにテンプレート関数にすることができます。

次のようなことができるようになりました。

std::vector<std::string> strings;
std::vector<int> integers;
std::transform(begin(strings), end(strings), 
               std::back_inserter(integers), str_to_int());

またはいつかあなたの定義を次のように変えてください:

struct str_to_int {
  int operator()(const std::string& s) const { return 23; }
  // ha
  int operator()(const std::wstring& s) const { return 42; }
  // haha!
  int operator()(const char* x) const { return 42; }
};

上記のコードは引き続き問題なく動作します。これは無料の関数には当てはまりません。

ランダムな発言: ポインタをそのようなものに渡すのはなぜstringですか?

于 2012-08-08T08:03:56.780 に答える
0

私は通常、関数を使用します。それをクラスに入れることは単なるノイズです(または、クラス自体には実際の動作がないため、疑似オブジェクト指向です)。

operator()()例外が 1 つあります。STL への関数型テンプレート引数は、関数ではなく ,を持つクラスを使用する場合、一般的により効率的です。(機能オブジェクトを使用する場合、呼び出される実際の関数はコンパイル時の定数であり、簡単にインライン化できます。関数を使用する場合、テンプレート引数は関数自体ではなく関数の型であり、インライン化は少なくなります。ただし、この場合でも、関数から始めて、必要に応じて機能オブジェクト型を追加します。

于 2012-08-08T09:13:35.670 に答える