1

クラスのメンバーとして構造体を持つための構文についていくつか疑問があります。

私はこの構造体を持っています:

/*  POS.H   */
#ifndef POS_H
#define POS_H
struct pos{
    int x;
    int y;

    pos operator=(const pos& a){
        x=a.x;  y=a.y;
        return a;
    }

    pos operator+(const pos& a)const {
        return (pos){a.x+x,a.y+y};
    }

    bool operator==(const pos& a)const {
        return (a.x==x && a.y== y);
    }
};
#endif /* POS_H */

そして別のファイルには主な機能があります:

/* MAIN.CPP */
#include "pos.h"
#include "clase.h"
int main(){
    pos pos;
    pos.x=0;
    pos.y=0;
    clase clase();
}

次に、クラスclaseを含むファイルclase.hには3つの異なるコンテンツがあります。

これはうまくコンパイルされます:

#include "pos.h"
class clase{
    private:
        pos posi;
    public:
        clase(pos pos):posi(pos){};
};

これはコンパイルされません(メンバーの名前を変更するだけです):

#include "pos.h"
class clase{
    private:
        pos pos;
    public:
        clase(pos pos):pos(pos){};

これも正常にコンパイルされます(posをnemeとして使用しますが、キーワードstructを使用します)。

#include "pos.h"
class clase{
    private:
        struct pos pos;
    public:
        clase(struct pos pos):pos(pos){};
};

私の質問は、なぜこれらのコードがコンパイルされるのか、コンパイルされないのかということです。

4

1 に答える 1

1

メンバーに構造体名と同じ名前を付けることは、伝統的に適切なコーディング方法ではありません。構造体型を強制しない限り、pos という名前のプライベート メンバーを宣言しようとすると、コンパイラが混乱するようです。

要するに、名前の競合にすぎません。構造体またはオブジェクト名とは少し異なる名前をメンバーに付ける習慣を身に付ける必要があります。おそらく、TitleCase で構造体とオブジェクトに名前を付けてから、メンバーに camelCasing を使用します。この例では、struct POS に名前を付けてから、クラス private: POS mPos; に名前を付けます。

于 2012-12-27T04:19:21.793 に答える