2

私には3つのクラスがあり、それぞれを別のlikeso内で使用したい:

class Object
{
public:
    Object();
    ~Object();


protected:

   int x;
   int y;
private:
  Line l;
  Circle c;
}; 

class Line : public Object
{
public:
    Line ()
        {
           x = x+y;
         }
    ~Line ();


private:
}; 

class Circle : public Object
{
public:
    Circle()
        {
           x = x/y;
         }
    ~Circle();


private:
}; 

したがって、ここでの問題は、コンパイル時に base undefined というエラーが表示され、#defineandを使用しようとしまし#ifdefineたが、機能しないことです。

理想的には、私がやりたいことは、main呼び出すオブジェクトを1つ持ち、使用する他のすべての変数がそこに設定され、同時にこのオブジェクトが異なる可能性があるため、LineまたはCircle.

4

6 に答える 6

4

これはできません。コンパイラがそれを行うことは不可能です。

代わりに、オブジェクトの直接のインスタンスではなく、オブジェクトへのポインターが必要です。

次に、クラスのいわゆる「前方」宣言を行います。

class Circle;
class Line;
class Object
{
    Line* line;
    Circle* circle;
}

もちろん、生のポインターよりもスマート ポインターを使用する方がよいでしょう。

于 2013-03-08T00:37:19.507 に答える
3

私の推測では、任意のオブジェクトを線や円などのプリミティブなグラフィカルオブジェクト、または複合オブジェクトにする必要があります。他のいくつかを含むオブジェクト。

あなたは実際にほとんどそこにいます:あなたがすべきことは:

  • オブジェクトからサブクラスインスタンスを削除しObjectます(これが設計上の誤りである理由については、他の回答を参照してください)。

  • を継承する4番目のクラスを作成しますObject

    class Compound : public Object {
      public:
        Compound(){
        }
      private:
       Line line;
       Circle circle;
    };
    

これで、オブジェクトのリストを一般的な方法で操作したい場合は、簡単です。必要なのは、でアドホック仮想メソッドを定義Objectし、サブクラス(メソッドなど)でそれらをオーバーライドすることだけdrawです。

概念の詳細については、ポリモーフィズムに関するこのチュートリアルを参照してください。

于 2013-03-08T01:06:25.567 に答える