0

質問は、タイトルのいくつかの単語で説明するのは簡単ではありません。だから、私はユーザーによって実装されたいくつかのタイプのオブジェクトを管理したマネージャーがいます。オブジェクトには、たとえば、正と負の2つのタイプがあります。だから私はユーザーにクラス宣言を介してこのオプションを設定してもらいたいです。明らかな方法:

class Base;
class BasePositive : Base;
class BaseNegative : Base;

class UserObject1 : public BasePositive;
class UserObject2 : public BaseNegative;

結構です、うまくいきました。しかし、継承を使用したい場合:

class UserObjectBase : public BasePositive;
class UserObject3 : public UserObjectBase;

Ops、UserObjectBaseから派生したすべてのクラスはPositiveのみになります。独自のクラスを宣言し、正または負のタイプを設定するためのユーザーの信頼できるメカニズムを取得したい(たとえば)。だから、私は基本クラスのいくつかのフィールド/プロパティをオーバーライドするためのいくつかのメカニズムを検索しました(それが何であるかに関係なく-それを達成するだけです)。

本当に、私はマクロなしで解決策を見ませんでした。しかし、他の誰かが知られている可能性がありますか?

C ++ 11-拡張機能は使用できません(必要ですが、使用できません)。

アップデート:

仮想継承で私はいくつかの成功を収めました:

#include <iostream>

struct base {
    ~base() {}
    int value;

    bool isPositive;    
};

struct pos : virtual base {
    pos() {
        isPositive = true;
    }
};

struct neg : virtual base {
    neg() {
        isPositive = false;
    }
};

struct foobase : pos {};
struct fooNeg :  virtual foobase, virtual neg {};
struct fooPos : foobase {}; 

int main(int argc, char const *argv[])
{ 
    fooNeg f;
    std::cout << f.isPositive << "\n";
    fooPos p;
    std::cout << p.isPositive << "\n";
    return 0;
}

しかし、私が知っているように、仮想継承は悪い習慣です。他の何かを探しています...

4

3 に答える 3

1

純粋な仮想関数を探しているのでしょうか?

class Base {
public:
  enum Polarity { POSITIVE, NEGATIVE };
  virtual Pole polarity() const = 0;
};

これにより、ユーザーは自分のクラスが正か負かを宣言する必要があり、階層のさらに下に選択肢が残されます。

于 2012-09-10T09:30:41.083 に答える
1

「is-a」技法で「has-a」関係を表現したいということでしょうか?

一見すると、すべてのユーザー クラスに極性があるように見えます。(単一の) 継承によってこの属性を表現するのは厄介であり、実際に問題につながります。ユーザーは、クラスに正の値が含まれるか負の値が含まれるかを選択する必要がありますが、サブクラスは両方である可能性があります。

Joachim によって提案された多重継承は、ユーザー クラスの極性を簡潔に表現するための手法である可能性があります。それに関するMeyersの記事を読んでください。少なくとも、非公開にしてください!

おそらく、継承はこの問題の明確な解決策ではありません。 Pmr のヒントもその方向を示しています。別の識別属性 (離散/連続、高/低など) を追加したときに生じるスケーラビリティの問題を想像してみてください。

クライアントのコードが必要以上に冗長になる場合がありますが、少なくとも、クラスの爆発を余儀なくされることはありません!

于 2012-09-10T09:44:28.697 に答える
0

C++ は多重継承を処理できるため、個別の基本クラスを使用してそれらを組み合わせることができることに注意してください。何かのようなもの:

class PosNegBase;
class Positive : public PosNegBase;
class Negative : public PosNegBase;

class UserObjectBase;
class UserObject3 : public UserObjectBase, public Positive;
class UserObject4 : public UserObjectBase, public Negative;
于 2012-09-10T09:32:24.063 に答える