0

現在、このオブジェクトの階層を構築しており、基本クラスでロギングをもう少し明確にできるようにするために、クラスの型を返すある種の変数または関数を使用することにしました。

例えば:

class fruit {
   string _type;

   fruit() {
       _type = "base"; // or i dont have to set it. however, it wont be inforced
   }

   virtual const char* type() const { return "base"; } // or just = 0 to inforce it

   void function() {
       log(this->type(), " tastes good");
       log(this->_type, "tastes good");
   }
}

class apple : public fruit {

   apple() {
       _type = "apple";
   }

   const char* type() const { return "apple"; }
}

ご覧のとおり、2つのアプローチがありますが、個人的には、実装する必要があることは明らかであるため、戻り値バージョンの方がはるかにクリーンだと思います。

しかし、私の質問は、どのアプローチが最良のアプローチであるかということです。そして、何かをログに記録するたびに関数を呼び出すのははるかに遅いですか?最適化されると思っていましたが、間違っている可能性があります。

4

1 に答える 1

1

まず、プログラムのクラスのタイプを知る必要がある場合は、設計に問題があります。通常、プログラムが具体的な実装に依存するのではなく、インターフェイスに依存することをお勧めします。

とにかく、関数は純粋仮想関数である必要があります。そうしないと、派生クラスごとに実装しないと、派生クラスに対して間違った型が取得されることになります。

文字列を割り当てることと文字列リテラルを返すことはどちらも問題ありません。
文字列リテラルには静的な保存期間があるため、プログラムの期間中有効になります。また、ユーザーが返されたリテラルを変更して未定義動作const charを引き起こさないように、適切に戻り型があります。 メンバーを返すことも問題ありませんが、クラスに追加のメンバーのオーバーヘッドが追加されるだけで、この追加のメンバーについてあまり心配する必要はありません。

于 2012-04-11T03:42:27.757 に答える