クラスを構造体として転送することに興味がありますか? これは完全に合法的なようですが、いくつかのユースケースが存在しますか?forwardクラスの前に構造体として宣言されている型を宣言する
struct Bar;
class Foo
{
Bar * bar_;
};
class Bar
{
};
クラスを構造体として転送することに興味がありますか? これは完全に合法的なようですが、いくつかのユースケースが存在しますか?forwardクラスの前に構造体として宣言されている型を宣言する
struct Bar;
class Foo
{
Bar * bar_;
};
class Bar
{
};
struct Bar;
class Bar;
これらは同等であり、それは問題ではありません。
ですが、いくつかのユースケースがありますか?
特別なIIRCはありません。
に該当するケースがあります。それは、両方に対して異なるマングリングを使用します。 – krzaq
@krzaqオッケー、ユースケースは何ですか? –
同じキーワードで前方宣言するためのユースケースがありますが、これ以上のユースケースはありません。それはプログラムの意味に違いはありません。 クラスキー識別子は、クラスの定義時にのみ違いがあります。
上記は標準準拠のコンパイラに適用されます。非準拠のものの中には、宣言を別の方法で処理するものがあります。その場合、はです。特にと同じキーワードを使用する場合があります。
ここでは実際の使用例です。たとえば、struct
というキーワードのクラスを実装したとします。時間が経つと、クラスは複数のコードベースで広く使用され、同じキーワードを使用して多くのヘッダーで宣言されます。後で、おそらく大量の機能を追加した後に、class
がより適切であり、コードをリファクタリングすることに決めました。新しいキーワードを使用するために、関係のないコードベースをすべてリファクタリングする必要はありません。
有用ではありません。
C++では、構造体とクラスの違いは、構造体メンバーがデフォルトでpublicであることです。
あなたの例では、クラスが構造体またはクラスとして動作するかどうかを判断するためにコードリーダーを混乱させることがあります。あなたが詳細については、この記事を読むことができます
これはどちらか一方を使用する場合です。これは前向き宣言だけです。 –
@GillBatesなぜ宣言だけを読むことによって、定義で使用されているキーワードをプログラマが知ることが有用なのかを理解するのに重要な知識です。 – user2079303
私が意味することは、構造体としてのクラスの前方宣言は許されていますが、インタレストレスはなく、コードの理解度を混乱させるだけです。 – Abel
ビューの言語の観点から、struct
またはclass
として、前方宣言class
に違いはありません。
class Foo;
struct Foo;
class Bar;
struct Bar;
class Foo{}; // 100% ok
struct Bar{}; // 100% ok
残念ながら、は、これらのキーワードを異なる方法で網羅しています。 hereと記載されているように、名前のマングリングが同じである場合には、これは厄介なことがあります。
は考えてみましょう:
// process.h
struct Foo;
void processIfNotNull(Foo*);
// foo.h
class Foo{};
あなたは共有ライブラリで、このような機能をエクスポートする場合、彼らはFoo
の定義を持っていない限り、ユーザーはprocessIfNotNull
を呼び出すことができなくなります。
コンパイラの中には、それが不一致のときに警告を出すものがあります。いくつかの(古い?)コンパイラはstruct/classに対して異なるマングリングを使用しています。 – Jarod42
@ Jarod42 MSVCを使用している場合、visual2015 – Guillaume07