0

関数の宣言に関する簡単な質問。私が次のコードを持っているとしましょう:

class a{
    int var;
    /* stuff*/
}

class b : a{
    /* other stuff*/
}

class c : a{
    /* more other stuff*/
}

class d{
    myFunctionThatWantsTheIntNamedVar(SubClassOfClassA SomeClassUnknownAtCompileTime);
}

そしてmyFunctionThatWantsTheIntNamedVar()はまさにそれを望んでおり、整数(varと呼ばれる)はaの基本クラスで宣言されています。クラスdの関数には、クラスbまたはクラスcのインスタンスを渡すことができます。これは、コンパイル時(実行時のみ)にはわかりません。

クラスbまたはcのいずれかを取り、同じ基本変数を取得できる関数を簡潔に宣言する方法はありますか?

その間に私が行ったことは、次のように、クラスdで2つのメソッドを宣言することです。

class d{
    myFunctionThatWantsTheIntNamedVar(c aClassCInstance);
    myFunctionThatWantsTheIntNamedVar(b aClassBInstance);
}

これは問題ありませんが、2つのメソッドのコードは同一です...そしてオブジェクト指向プログラミングの私の理解から、コードが同一であれば、それをより良い関数に組み合わせることができるはずです。

これについて何か考えはありますか?私は小さな会社で働いており、フィードバックを得るのが難しい場合があるため、ここでベストプラクティスやその他のアドバイスを探すだけです。

編集:申し訳ありませんが、コードにエラーがあり、次のように変更しました:

myfunctionThatWantsTheInNamedVar(a aClassAInstance);

に:

myfunctionThatWantsTheInNamedVar(c aClassCInstance);

私の悪い。

4

3 に答える 3

6

変数へのアクセスを提供するパブリックアクセサーメソッドを提供し、クラスbとクラスcでその名前を非表示にしないようにしてください。

class a{
    int var;
    /* stuff*/
 public:
  const int& getVar() const { return var; }
  int& getVar() { return var; }
};

次にa、inoyur関数を参照します。

class d{
 public:  // you probably want a public member function
    myFunctionThatWantsTheIntNamedVar(const a& theA) {
      int n = theA.getVar();
}

b次に、またはcインスタンスを使用して呼び出すことができます。

b b0;
c c0;
d d0;
d0.myFunctionThatWantsTheIntNamedVar(b0);
d0.myFunctionThatWantsTheIntNamedVar(c0);

コードでは、変数はプライベートであり、クラスとvarの継承も同様であることに注意してください。これを機能させるには、継承を公開する必要があります。bc

class b : public a { .... };
class c : public a { .... };
于 2012-09-14T21:25:47.343 に答える
3
class d{
    myFunctionThatWantsTheIntNamedVar(const a& anA);
}

の実際のインスタンスを禁止したいが、派生クラスは許可したい場合は、実行時型情報を使用して、それが実際には派生クラスではなく、aである場合に例外をスローできます。

実装のない純粋仮想関数がaにある場合(ただし、実装を提供するにはbとcが必要です)、aをインスタンス化することさえできないため、チェックは必要ありません。しかし、それはあなたがそれをする理由がある場合にのみです-私はこれのためだけにそのような人工的な構造を提案しません。

于 2012-09-14T21:22:56.687 に答える
1

なぜこれではないのですか?

class d{
   void myFunction(A a) {;}
};

両方の関数のコードが同じであると言う場合、これは、クラスCとBの間で異なるものを使用しないことを意味します。つまり、BとCに共通するものだけを使用します。これは、実際にはクラスA。

もちろん、(A a)は単なる例示です。必要に応じて、引数を(const A&a)または(A * pA)として宣言する必要があります。また、varパブリックアクセサーにカプセル化することで、パブリックにするか、より良いものにすることで、階層の外側に何らかの形で表示されると思います。

于 2012-09-14T21:25:37.263 に答える