我想写两个类,在超类中我需要方法女巫作为参数有一个子类,如下例示例:
class class1
{
int a;
void print(class2 k)
{
cout<<k.b*a;
}
};
class class2 :public class1
{
public:
int b;
};
不幸的是,这是不对的;-)我无法弄明白,有人可以帮忙吗?
答案 0 :(得分:2)
使用转发声明并将实施移到class
:
class class2;
class class1
{
int a;
void print(class2 k);
};
class class2 :public class1
{
public:
int b;
};
您无法将该方法保持为内联,因为您需要class2
的完整类型,但此时无法使用该类型。
但这里的主要问题是设计,这是错误的。为什么基类需要知道并且更多 - 因此从派生类调用方法?
答案 1 :(得分: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;
}
答案 2 :(得分:0)
问题的一个可能解决方案是不在基类中实现print()
,而是强制任何继承类使用纯虚函数来实现它。目前,你' d probbaly使用以下代码调用您的代码:
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()
当然,这可能无法帮助您完成您想做的事情,但我认为这通常是解决您所描述问题的更好方法。