1

私は2つのクラスを書きたいと思っています。スーパークラスでは、このサンプルコードのようなサブクラスを持つパラメーターとしてメソッドwitchが必要です:

class class1
{
    int a;
    void print(class2 k)
    {
        cout<<k.b*a;
    }  
};

class class2 :public class1
{
    public:
    int b;
};

残念ながら、これは正しくありません;-)そして、私はそれを理解することができません.誰か助けてもらえますか?

4

3 に答える 3

2

前方宣言を使用して、実装を の外に移動しますclass

class class2;
class class1
{
    int a;
    void print(class2 k);
};

class class2 :public class1
{
    public:
    int b;
};

class2その時点で使用できない完全な型が必要なため、メソッドをインラインに保つことはできません。

しかし、ここでの主な問題はデザインであり、これは間違っています。なぜ基本クラスは、派生クラスからメソッドを知る必要があるのでしょうか?

于 2012-06-22T14:01:56.060 に答える
0

この問題に対する考えられる解決策の1つはprint()、基本クラス内に実装するのではなく、継承するクラスに純粋仮想関数を使用して実装するように義務付けることです。現時点では、おそらく次を使用してコードを呼び出します。

class2 c2;
c2.b = 20; // for example
class1 c1;
c1.print( c2 );

しかし、これを実装するためのより良い方法は次のようになります。

class class1
{
protected:
    int a;

public:
    virtual void print() const = 0;
};

class class2 : public class1
{
public:
    int b;
    void print() const;
};

void class2::print() const
{
    cout << b * a;
}

したがって、今class2は、ある意味で正しい印刷機能を実装する必要があります。これは、知っている必要がありますが、その逆ではないためです。class2class1今、あなたはこれを行うことができます:

class2 c2;
c2.b = 20; // for example
c2.print()

もちろん、これはあなたがやりたいことには役立たないかもしれませんが、一般的にあなたが説明する問題に取り組むためのより良い方法だと思います。

于 2012-06-22T14:22:15.477 に答える
0
class class2;

class class1
{
    int a;
    inline void print(class2 &k); //pass by reference, but implemented after class2 is completely known to the compiler.
};

class class2 :public class1
{
    public:
    int b;
};

void class1::print(class2 &k)
{
    cout<<k.b*a;
}  
于 2012-06-22T14:11:31.217 に答える