2

オプション1:

//A.h
class A
{
   void foo()
   {
   }
};

オプション2:

//A.h
class A
{
    void foo();
};

inline void A::foo()
{
}

オプション2では、メソッドはヘッダーにも実装されていることに注意してくださいinline(複数定義を防ぐためにマークされています)。

4

4 に答える 4

4

あなたがそれを提示したように、違いはありません。ただし、2番目の形式は、の後に続く宣言を利用するために使用されることがありますclass A

例えば:

class A
{
  void foo();
};
class B : A { };
inline void A::foo() {
   B b;
}

最初の形式では、そのような使用はB不可能です。

于 2012-10-17T15:01:36.473 に答える
1

クラス定義内で定義されたメソッドは暗黙的inlineに存在するため、機能的には違いはありません。

ロブは1つの違いについて正当な理由を提供します。もう1つ、IMOです。

あなたが持っていると言う:

class DBConnection
{
public:
   DBConnection(const Config& config)
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   void reconnect()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   void checkIntegrity()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   void runQuery()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   void dropTables()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   void disconnected(Callback callback)
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   void selectTables()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   Results getResults()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
        //YES, I copy-pasted these
   }
   //MANY MORE
}

教えてください、データベースが切断されたときに通知を受け取る方法はありますか?

ここで、次のコマンドで再試行してください。

class DBConnection
{
public:
   DBConnection(const Config& config);
   void reconnect();
   void checkIntegrity();
   void runQuery();
   void dropTables();
   void disconnected(Callback callback);
   void selectTables();
   Results getResults();
   //MANY MORE
};

inline DBConnection::DBConnection(const Config& config)
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline void DBConnection::reconnect()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline void DBConnection::checkIntegrity()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline void DBConnection::runQuery()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline void DBConnection::dropTables()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline void DBConnection::disconnected(Callback callback)
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline void DBConnection::selectTables()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
   }
   inline Results DBConnection::getResults()
   {
        //some
        //really
        //complicated
        //logic
        //and
        //checks
        //and
        //stuff
        //I dunno
        //not
        //a
        //db
        //guy
        //possibly
        //exceptions
        //thrown?
        //YES, I copy-pasted these
   }

簡単ですよね?

于 2012-10-17T15:07:13.583 に答える
0

これら2つの定義の間に大きな違いはありません。

オプション1では、そのメソッドはインライン関数として呼び出され、ループやより多くのコード行を許可しません。高速実行のため。

オプション2では、外部ボディ定義と呼ばれ、任意の行数を書き込むことができます。

インラインとは、複数の定義を妨げないことを意味すると思います。これは、ループなどを使用せずに少量のコードを実行することを意味します。

于 2012-10-17T15:04:16.157 に答える
0

いいえ、大きな違いはありません。どちらも、foo()メソッドをインライン化できる/インライン化する必要があることをコンパイラーに示唆しています。

KerrekSBは、より多くのコードが必要であることを正しく指摘していますが、もちろん利点もあります。インラインメソッドを使用する場合でも、「インターフェイス」と「実装」を分離するオプションがあります。

たとえば、ヘッダーファイルの先頭にクラスインターフェイスを表示し、.hファイルの残りの部分を「インライン実装」として明確にマークすることができます。または、インライン実装に2番目のヘッダーファイルをインクルードすることもできます。

//A.h
class A
{
    void foo();
};
// "import" the inline implementations
#include "A.ipp"

そして、次のようにA.ippを使用します。

//A.ipp
inline void A::foo()
{
}

注意点:「3番目の非慣用的なC ++ファイルタイプ」(クラスの場合は.h、「通常の」ソースファイルの場合は.cpp、インライン実装の場合は.ipp)が原因で、同僚と混乱する可能性があります。

于 2012-10-17T15:25:32.003 に答える