1

から継承するクラスAと2つのクラスとがBあります。CA

のメソッドとは別に、各クラスは異なるものを提供するため、インライン関数を備えたテンプレートであるため、2つの異なるファイルにA入れたいと思います。b.hppc.hpp

とクラスUserの両方を使用するクラスもあります。では、次のようなものが必要です。BCuser.cpp

# include "b.hpp"
# include "c.hpp"

class User{
    ...;
};

Bこれは、私が両方のクラスとCに保持しているものに対して、コンパイラの再定義エラーを発生させbc.hppます。

ここでの懸念は、プログラミングエラー以外はかなり美的です。小さなアプリケーションでディレクティブを使用すると、あまりエレガントifdef / ifndefではありません。モジュールを管理しすぎている人や、モジュールを認識していない人にとっては、IDEのソリューションのように見えます。ディレクティブ。

これに対する回避策はありますか(非標準ですが、少なくとも正常です)、または同じファイルに2つの異なるクラスがあり、を使用することに固執する必要がありますifdef / ifndefか?

4

3 に答える 3

2

ヘッダーファイルで意味する場合、いいえ、これを行うための優れたポータブルな方法はありません。すべてのヘッダーファイルを次の形式で保持するのが標準です-

#ifndef MYHEADER_HPP
#define MYHEADER_HPP

// ... content

#endif

他の方法は非標準であり、実際のC++ではありません。

于 2013-02-26T04:44:07.407 に答える
2

いつでも使用できます#pragma once

于 2013-02-26T04:44:57.740 に答える
1

ifndef本当に良い習慣です。これらは、ファイルヘッダーを自己完結型にするのに役立ちます。

別のファイルのどこかでステートメントAを削除したために、一部のファイルのコンパイルを停止したくない場合。したがって、そのことについては、との両方に含めます。多分含まれていますが、それは問題ではありません。それ以外の場合は、から削除するたびにを追加する必要があります。includeCBCABABinclude CBinclude CA

したがって、ifndef実際には良い習慣であり、使用する必要があります。コンパイラーによっては、pragmaなどの構文上のショートカットが1回ある場合があります(ここで説明を見つけてください)。ただし、ほとんどのコンパイラーでサポートされている場合でも、標準ではないことに注意してください。

ところで、プロのプロダクションコードはifndefガードを使用します。

于 2013-02-26T04:47:37.617 に答える