Re: Forward declaration of cyclical covariant types?
* Patrik Kahari:
//file 1:
struct Y; //fwd decl
struct X {
virtual Y& covariantY();
};
struct Y {
virtual X& covariantX();
};
//file 2:
struct Y1; //fwd decl
//struct Y1: public Y; //How do you fwd declare that a type is derived
from another type?
struct X1: public X {
virtual Y1& covariantY(); //Error 'X1::covariantY': overriding
virtual function return type differs and is not covariant from
'X::covariantY
};
struct Y1: public Y {
virtual X1& covariantX();
};
<code>
// Module 1.
class Y;
class X
{
private:
virtual Y& virtualY();
public:
Y& publicY();
};
class Y
{
private:
virtual X& virtualX();
public:
X& publicX();
};
Y& X::virtualY() { static Y y; return y; }
Y& X::publicY() { return virtualY(); }
X& Y::virtualX() { static X x; return x; }
X& Y::publicX() { return virtualX(); }
// Module 2:
class Y1;
class X1: public X
{
private:
virtual Y& virtualY();
public:
Y1& publicY1();
};
class Y1: public Y
{
private:
virtual X& virtualX();
public:
X1& publicX1();
};
Y& X1::virtualY() { static Y1 y; return y; }
Y1& X1::publicY1() { return static_cast<Y1&>( virtualY() ); }
X& Y1::virtualX() { static X1 x; return x; }
X1& Y1::publicX1() { return static_cast<X1&>( virtualX() ); }
// Module 3.
int main()
{
X* p = new X1();
p->publicY(); // Reference to an Y1.
delete p;
}
</code>
But I suspect that it would be better to focus on fixing the design rather
than
finding ways to shoehorne the thing into C++ rules.
Also, don't take the static_cast's too literally.
Cheers & hth.,
- Alf
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]