0

次のようなヘッダーファイルがあります。

class Model {
 private:
  struct coord {
    int x;
    int y;
  } xy;
 public:
  ....
 coord get() const {
  return xy;
 }
};

そして、さらに別のファイル(ModelObjectが存在すると仮定):

struct c {
 int x;
 int y;
 void operator = (c &rhs) {
   x = rhs.x;
   y = rhs.y;
 };
} xy;

xy = ModelObject->get();

コンパイラは、coordからcへの既知のcovnersionがないことを示すエラーをスローします。クラスヘッダー内で宣言されているため、座標型がわからないためだと思います。クラスの外で構造体を宣言することでそれを回避することはできますが、私は自分のやり方でそれを行うことができるのか、それとも一般的に悪い習慣と見なされているのか疑問に思いました。

4

3 に答える 3

2

Model::coordtoへの暗黙の変換演算子が必要になりcます。これを行う方法については、C++の暗黙的な変換演算子を参照することをお勧めします。

また、「クラス内にあるため型がわからない」と言った場合はModel::coord、外界への構造体型として使用します(coord公開されている限り、現在の場合はそうではありません)。

于 2012-04-14T05:26:10.043 に答える
1

あなたが提供したコードには2つの大きな問題があります: 1。からへ
の変換を与えていません。2.プライベートと宣言されているため、 外部で 使用することはできません。struct coordstruct c
struct coordclass Model

  1. struct coordとが似ているとしてもstruct c、コンパイラーの超能力は非常に限られています。コンパイラーの場合、2つの構造体は、本質的に同じであっても異なります。これを解決する1つの方法は、次struct cのタイプをとる適切な割り当て演算子を与えることstruct coordです。

    strutc c {  
        ...  
        void operator = (const coord& rhs) { ... }  
    };  
    
  2. 外で使用するには、struct coordもっと公開する必要がありclass Modelます。
    これを行うには、a)クラスModelの外部で宣言するか、
    b )クラスModelの内部でパブリックとして宣言します。struct coord

    後者を行う場合はModel::coord、構造体にアクセスするために修飾名を使用する必要があります。

備考:
方法の変更を検討してください

    coord Model::get() const;  

    const coord& Model::get() const;  

大きな違いを生む微妙な変化。これにより、スタック上のの暗黙的な構築が保存struct coordされます。

演算子の変更を検討してください

    void c::operator = (c &rhs);  

    void c::operator = (const c& rhs);  

代入演算子は指定された引数structcを変更しないためです。
定数の正確さは、糖衣構文だけでなく必須であり、読みやすさを向上させます。

だからこれは私の提案です:

class Model {
public:
    struct coord {
        int x; int y;
    };

private:
    coord xy;

public:
    const coord& get() const { return xy; }
};

struct c {
    int x; int y;

    void operator = (const c &rhs) { x = rhs.x; y = rhs.y; };
    void operator = (const Model::coord &rhs) { x = rhs.x; y = rhs.y; };
};  
于 2012-04-14T08:38:12.667 に答える
0

コンパイラーに変換を行わせるには、座標を取るcのコンストラクターを追加するだけで十分です。では、なぜこれに2つの異なるタイプがあるのですか?この座標クラスをモデルから因数分解して、両方のポイントで使用する方がよいのではないでしょうか。

于 2012-04-14T05:50:19.150 に答える