オプション1:
//A.h
class A
{
void foo()
{
}
};
オプション2:
//A.h
class A
{
void foo();
};
inline void A::foo()
{
}
オプション2では、メソッドはヘッダーにも実装されていることに注意してくださいinline
(複数定義を防ぐためにマークされています)。
//A.h
class A
{
void foo()
{
}
};
//A.h
class A
{
void foo();
};
inline void A::foo()
{
}
オプション2では、メソッドはヘッダーにも実装されていることに注意してくださいinline
(複数定義を防ぐためにマークされています)。
あなたがそれを提示したように、違いはありません。ただし、2番目の形式は、の後に続く宣言を利用するために使用されることがありますclass A
。
例えば:
class A
{
void foo();
};
class B : A { };
inline void A::foo() {
B b;
}
最初の形式では、そのような使用はB
不可能です。
クラス定義内で定義されたメソッドは暗黙的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
}
簡単ですよね?
これら2つの定義の間に大きな違いはありません。
オプション1では、そのメソッドはインライン関数として呼び出され、ループやより多くのコード行を許可しません。高速実行のため。
オプション2では、外部ボディ定義と呼ばれ、任意の行数を書き込むことができます。
インラインとは、複数の定義を妨げないことを意味すると思います。これは、ループなどを使用せずに少量のコードを実行することを意味します。
いいえ、大きな違いはありません。どちらも、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)が原因で、同僚と混乱する可能性があります。