9

さて、私は[C ++で]構造体を使用してコードを書いていますが、構造体をヘッダーファイルに実装するのかソースファイルに実装するのかわかりません。

構造体にはコンストラクターが含まれています。

struct Point
{
    double x;
    double y;

    Point(double xCo, double yCo)
    {
        this->x = xCo;
        this->y = yCo;
    }

    int comparePoint(Point point)
    {
        ...
    }
};

私はヘッダーファイルに次のように書きました。

typedef struct Point point;

それは十分に良いですか、それとも悪いデザインですか?私がいくつかのウェブサイトで読んだように、構造体は通常ヘッダーファイルに実装されています、

しかし、私が[Cで]持っていた以前の課題では、コースのスタッフが、実装ではなく構造体への宣言を含むヘッダーファイルを提供してくれました。

私はここでこれに似た他の質問を見ましたが、彼らは私の質問に実際には答えませんでした。

4

4 に答える 4

11

ヘッダーでコンストラクターを宣言し、cppファイルに実装を書き留めることができます。

struct Point
{
    Point(double xCo, double yCo);
    ...
};

Point::Point(double xCo, double yCo)
{
    ...
}

ただし、コンパイラは構造体に依存する他のcppファイルをビルドするためにヘッダーに依存しているため、ヘッダーに宣言が必要です。

于 2012-09-13T14:17:55.630 に答える
10

structCとC++の使用法には大きな違いがあります。

Cでは、struct宣言は型名ではなくタグを使用して構造体を宣言します。その結果、周囲struct Pointを追加しない限り、タグで参照する必要があります。typedef

C ++では、structはの同義語でclassあり、デフォルトのメンバーのアクセス可能性(プライベートの場合はプライベートclass、パブリックの場合struct)のみが異なります。タイプ名は常に。structなしで定義されるため、 C++で周りtypedefを追加する必要はありません。typedefstruct

これは、コンストラクターを宣言する方法には影響しません。ヘッダーにインライン化するか、実装に移動することができます。いずれにせよ、それは機能するでしょう。ヘッダーの初期化リストに引数を渡す単純な初期化子を配置する方がおそらく良いでしょう。より複雑な初期化はおそらくcppファイルに入れるべきですが、それは完全にあなた次第です。

于 2012-09-13T14:18:57.837 に答える
6

これに対する答えはありません。状況によって異なります。クライアント コードがコンストラクターの実装にアクセスできること、およびそこで変更を行うたびに再コンパイルする必要があることを気にしますか? その場合は、ヘッダーに実装しないでください。このコンテキストでは、C++ ではstructclassが同等であるため、同じ一般規則が両方に適用されることに注意してください。

あなたがすべきことは、コンストラクターの初期化リストを使用することです:

Point(double xCo, double yCo) : x(xCo), y(yCo) {}
于 2012-09-13T14:14:59.660 に答える
1

C++ では、構造体は「デフォルトのメンバー アクセシビリティ」がプライベートではなくパブリックに設定された単なるクラスであることを考慮すると、クラスをコーディングする場合とまったく同じように構造体を使用することをお勧めします。

于 2012-09-13T14:23:11.090 に答える