1

私は「AcceleratedC++」という本で母国語を学ぶ学生プログラマーです。作者がヘッダーファイルと関数を含むソースファイルについて説明しているところです。この本で説明されている演習では、作成者は関数の定義を含むヘッダーファイルを持っていますが、ソースファイルにも関数の定義があるため冗長に見えます。この場合、C ++をプログラミングするときのヘッダーファイルのポイントは何ですか?

例:ヘッダーファイル。

#ifndef MEDIAN_H
#define MEDIAN_H

#include <vector>
double median(std::vector<double>);

#endif // MEDIAN_H

次に、成績の中央値を決定する関数を含むソースファイル:

// source file for the `median' function
#include <algorithm>    // to get the declaration of `sort'
#include <stdexcept>    // to get the declaration of `domain_error'
#include <vector>       // to get the declaration of `vector'

using std::domain_error;   using std::sort;   using std::vector;

#include "median.h"

// compute the median of a `vector<double>'
// note that calling this function copies the entire argument `vector'
double median(vector<double> vec)
{
#ifdef _MSC_VER
    typedef std::vector<double>::size_type vec_sz;
#else
    typedef vector<double>::size_type vec_sz;
#endif

    vec_sz size = vec.size();
    if (size == 0)
        throw domain_error("median of an empty vector");

    sort(vec.begin(), vec.end());

    vec_sz mid = size/2;

    return size % 2 == 0 ? (vec[mid] + vec[mid-1]) / 2 : vec[mid];
}

median.hは、ソースにすでに定義が含まれている場合でも、median関数のソースファイルにコピーされますvector<double> vec 。この本では、無害で実際には良いアイデアであると説明しています。しかし、私はそのような冗長性の理由をよりよく理解したいだけです。どんな説明でも素晴らしいでしょう!

4

2 に答える 2

2

ヘッダーファイルの目的は、問題の機能を実際に実装するファイル以外のファイルにインクルードすることです。基本的に、C ++コンパイラに、どの関数が存在し、それらを呼び出すためにどのように見えるかを伝える必要があります。

たとえば、関数doStuff.cppがあるとします。

#include "median.h"

std::vector<double> my_vector;
double my_median;

void do_stuff(){
    my_median=median(my_vector);
}

median()C ++コンパイラは、関数が他の誰かのものではなく、特定の引数と戻り値を持っていることを知る必要がありますmedian()

于 2013-03-04T03:52:07.947 に答える
0

はい、これは冗長ですが、標準的な方法です。C / C ++コンパイラでは、関数を使用する前に宣言が必要です。場合によっては、これは、たとえば相互再帰関数がある場合など、実装の前に絶対に宣言が必要であることを意味します。プロジェクトに複数のファイルがある場合は、別のファイルから使用している関数の宣言も含める必要があります。これを行う最も簡単な方法は、それらを分離することです。

とは言うものの、宣言/実装もライブラリでの再利用性のために別々に保たれています。あなたが便利な関数の非常に大きなライブラリを作成し、他の誰かがそれらを使用したいとしていると想像してください。使用する関数の宣言をコンパイラに提供する必要があるため、.hファイルを使用します。

于 2013-03-04T03:52:17.680 に答える