1

私は「動物」と呼ばれるクラスを持っています。これはスーパークラスで純粋な多形です。他にも「Dog」、「Cat」、「Hamster」などのクラスがあり、すべて「Animal」クラスから継承しています。

プログラムでは、すべてのサブクラス(犬、猫、ハムスター)を含める必要がありますが、次の場合は次のようになります。

#include "Hamster.h"
#include "Dog.h"
...
...

エラーが発生します:

「クラス動物」の以前の定義</p>

これを防ぐ方法はありますか?

PS私は次のことを考えました:

#ifdef

ただし、クラスが使用される場合は、それを含めます。たとえば、プログラムがCatクラスを扇動しようとしている場合は、インクルードを実行します。

これがうまく説明されていない場合は申し訳ありません。

4

4 に答える 4

7

ヘッダーファイルでインクルードガードを使用します。

#ifndef ANIMAL_H
#define ANIMAL_H

//definitions

#endif
于 2012-10-29T14:46:25.200 に答える
5

各ヘッダーの上部に、

#pragma once

国際規格は、コンパイラがそれを理解しない場合、これを無視しなければならないと言っているだけです。

しかし、ほぼすべてのコンパイラがそれを理解しています。これは事実上の標準です。

の代わりに#pragma使用することです

#ifndef MYHEADER_H
#define MYHEADER_H

// Contents of header

#endif

これは、より醜く、冗長で、正しく理解するのが難しく、名前の衝突で失敗する可能性があり、効率が低下する可能性がありますが、完全に標準です。

とにかく、アイデアは、クラス定義のようなヘッダーの内容が同じ翻訳単位に2回以上含まれないようにすることです。

ただし、同じ翻訳単位で同じことを実行できることに注意してください。typedef

于 2012-10-29T14:50:25.513 に答える
1

ヘッダーファイルで使用でき#pragma onceますが、移植性はありません。#ifndef

于 2012-10-29T14:47:07.477 に答える
0

#pragma onceヘッダーファイルで使用します。

于 2017-03-17T20:49:07.853 に答える