1

我想写两个类,在超类中我需要方法女巫作为参数有一个像这个示例代码中的子类:

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
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 回答
0

您的问题的一种可能的解决方案是不在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有义务实现打印功能,这在某种意义上是正确的,因为class2应该知道class1但反之则不然。现在你可以这样做:

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

当然,这可能无法帮助您完成您想做的事情,但我认为这通常是解决您描述的问题的更好方法。

于 2012-06-22T14:22:15.477 回答