Visual C++ におけるクラス設計の一般的な実践 (パート 2) ——クラス定義

 

私は Liyuan Breeze です。IT 業界で 25 年のベテランとして、今日は Visual C++ でのクラス設計の一般的な実践を再検討します。プログラムは調整されており、実行する準備ができています。初心者プログラマーはたくさんの本を読みますが、その本では多くの場合、プログラマーの習慣についてではなく、文法についての説明が多くなっています。それでは、このトピックについて話しましょう。

前回の投稿でプログラムをビルドして書いた後、メニューの[生成]→[スタディの生成]をクリックすると、コンパイル結果に大量のエラーが報告されます。プロンプト クラスの定義を繰り返すと、多くのエラーが報告されます。

実際、すべてはファーザー クラスの定義が繰り返されていることが原因ですが、なぜこのエラーが発生するのでしょうか? Study.cpp ファイルを注意深く確認してください。このファイルには、father.h と Son.h という 2 つのヘッダー ファイルが含まれています。コンパイラーがstudy.cppファイルをコンパイルするとき、ファイルにはfather.hヘッダー・ファイルが含まれているため、コンパイラーはFatherクラスが定義されていることを認識してヘッダー・ファイルを展開し、次にson.hヘッダー・ファイルを展開し、son.hヘッダー・ファイルを展開します。 .h ヘッダ ファイルには Father.h も含まれており、father.h が再度展開されるため、Father クラスが繰り返し定義されます。

ヘッダー ファイルが繰り返しインクルードされる問題を解決するには、条件付き前処理ディレクティブを使用できます。いわゆる前処理命令は、C/C++ の文法では #ifndef #define #endif ですが、これを忘れている学生もいるかもしれません。

#ifndef、#define、および #endif は C/C++ 前処理ディレクティブで、条件付きコンパイルやヘッダー ファイルの繰り返しのインクルードを防ぐためによく使用されます。#ifndef if not defineの略で、マクロ定義の一種、正確には前処理関数(条件付きコンパイル)の一種です。

#ifndef を使用すると、次のエラーを回避できます。 .h ファイルにグローバル変数が定義されており、C/C++ ファイルに .h ファイルが複数回含まれている場合、#ifndef マクロ定義が追加されていない場合、変数定義の繰り返しエラーが発生します。 #ifndef を付けるとこのようなエラーは出なくなります。

#ifndef: 指定された識別子が定義されているかどうかを判断するために使用されます。識別子が未定義の場合は、以下のコード ブロックを実行します。それ以外の場合はスキップします。

#define: 指定された識別子の定義に使用され、通常はマクロの定義に使用されます。条件付きコンパイルでは、以下のコード内で条件判定を行うための識別子を定義するのによく使われます。

#endif : 条件付きコンパイルを終了するために使用されるコードのブロック。

変更されたヘッダー ファイルは次のとおりです。

Father.h コードを以下に示します。

#ifndef FATHER_H_H
#define FATHER_H_H

class Father

{
public:
  Father();
  ~Father();
  void eat();
  void run();
  virtual void study();
};

#endif

プログラム内でマクロを使用する場合は #define を使用してマクロを定義することが一般的ですが、これによりプログラムが簡潔になり、保守が容易になりますが、ここではクラスの重複を避けるために FATHER_H_H が定義されているかどうかを判断するだけです。定義があるため、特定の値を定義する必要はありません。マクロ名を選択するときは、あまり一般的ではない名前を選択してください。当社のプログラムは、他の人が作成したプログラムと統合されることが多いためです。非常に一般的な名前を選択すると、不要な間違いが発生する可能性があります。

Son.h コードを以下に示します。

#include "father.h"

#ifndef SON_H_H
#define SON_H_H

class Son:public Father
{
public:
  void study ();
};
#endif

Study.cpp のコンパイルプロセスを見てみましょう。コンパイラーが Father.h ヘッダー ファイルを展開すると、条件付きプリプロセス ディレクティブは FATHER_H_H が定義されていないと判断し、最初に FATHER_H_H が定義されてから実行を継続し、Father クラスを定義してから、son.h ヘッダー ファイルを展開し、 son.h ヘッダ ファイルには Father.h も含まれており、father.h を再度展開すると、条件付き前処理命令は FATHER_H_H が定義されていることがわかり、#endif にジャンプして実行が終了します。

分析の結果、このコンパイル プロセスでは、Father クラスが 1 回だけ定義されていることがわかりました。プログラムを再度コンパイルして実行すると、正しい結果が表示されます。

前回の投稿では、Visual Studio 2022 によって生成されたヘッダー ファイルにコマンド コード #pragma Once が自動的に追加されると述べましたが、このコードは何を行うのでしょうか? 次に、father.h および Son.h ヘッダー ファイル内のコードのコメントを解除し、作成した条件付き前処理ディレクティブ コードをコメント アウトします。変更されたヘッダー ファイルは次のとおりです。

Father.h コードを以下に示します。

#pragma once

//#ifndef FATHER_H_H
//#define FATHER_H_H

class Father
{
public:
  Father();
  ~Father();
  void eat();
  void run();
  virtual void study ()
};

//#endif

Son.h コードを以下に示します。

#pragma once
#include "father.h"

//#ifndef SON_H_H
//#define SON_H_H

class Son:public Father
{
public:
  void study ();
};

//#endif

再度プログラムをコンパイルして実行すると、ヘッダーファイルが繰り返しインクルードされていても問題がないことがわかります。実際、コード #pragma Once は、ヘッダー ファイルの繰り返しのインクルードを避けるためにも使用されます。違いは、この命令コードが Visual Studio 2022 の C++ コンパイラに固有であることです。他のプラットフォームで C++ コードを記述するために使用することはできません。 。Windows プラットフォームで実行される C++ プログラムを作成するだけの場合は、この命令を使用して条件付き前処理命令を置き換えることができ、これは簡単で便利です。


次に、プロジェクトが生成されるたびに Visual Studio 2022 が自動的に生成する pch.h ファイルの役割を見てみましょう。pch.h ファイルを開くと、次のコードが表示されます。

pch.h コードを以下に示します。

#ifndef PCH_H
#define PCH_H

//TODO:添加要在此处预编译的标头

#endif //PCH_H

これは単なるプリコンパイルされたヘッダー ファイル (条件付き前処理命令を使用) であることがわかり、その機能はヘッダー ファイルが繰り返しインクルードされるのを防ぐことでもあります。一般的に使用されるヘッダー ファイルを TODO 位置に導入するか、いくつかのグローバル変数定義を置くことができます。ここです。このファイルには実質的な内容はありませんが、作成するソース ファイルにはこのヘッダー ファイルも含める必要があります。そうしないとコンパイルが失敗します。これはなぜですか? これは、Visual Studio 2022 ではプロジェクトの生成時にプリコンパイル済みヘッダー ファイルの使用が強制されるため、ソース ファイルにプリコンパイル済みヘッダー ファイルを含める必要があるためです。

このファイルを使用しないことも簡単です。Visual Studio 2022 のソリューション エクスプローラー ウィンドウで、プロジェクト名を右クリックし、[プロパティ] を選択して、プロジェクトの [プロパティ ページ] ダイアログを開きます。[構成] ドロップダウン リストで、[すべての構成] を選択します。[構成プロパティ] > [C/C++] > [プリコンパイル済みヘッダー] プロパティ ページを選択します。プロパティのリストで、[プリコンパイル済みヘッダー] プロパティのドロップダウン リストを選択し、[プリコンパイル済みヘッダーを使用しない] を選択します。[OK] を選択して変更を保存します。[OK] ボタンをクリックすると、ソース ファイル内の pch.h ヘッダー ファイルへの参照を削除できます。

著者について: Li Yuan Weifeng、1981 年生まれ、上級エンジニア、浙江大学工学修士、ソフトウェア エンジニアリング プロジェクト監督者、プログラマー、ソフトウェア デザイナー、システム アーキテクト、初期の Windows プログラマー、忠実な Visual Studio ユーザー、C/ C++ ユーザー 著者は、UNIX 時代、デスクトップ WIN32 時代、Web アプリケーション時代、クラウドコンピューティング時代、携帯電話 Android 時代を経験し、コンピュータ業界で 25 年間勉強し、苦労してきたベテランです。ビッグデータ時代、ICT時代、AIディープラーニング時代、知能機械時代、これからどんな時代になるか分からないけど、この旅は苦難と得物に満ちていたことだけは覚えている、そして私は希望に満ちてあなたとともに進んでいきたいと思っています。

おすすめ

転載: blog.csdn.net/wang2015cn/article/details/131836391