N
Nephi Immortal
Please check to make sure if my code is safe since I chose to define only one class instead of two classes as const class and non-const class. Are you positive sure if undefined behavior does not occur? I am told that if I declare const_cast before undefined behavior will occur.
Is copy constructor in class Y safe?
class Y;
class X
{
friend class Y;
public:
X( int data1, int data2 );
Y Get() const;
Y Set();
private:
int data1;
int data2;
};
class Y
{
public:
Y( X& p );
Y( const Y& r );
int Value1() const;
void Value1( int data );
int Value2() const;
void Value2( int data );
private:
X& pX;
};
X::X( int data1, int data2 ) : data1( data1), data2( data2 )
{
}
Y X::Get() const
{
return Y( const_cast< X& >( *this ));
}
Y X::Set()
{
return Y( *this );
}
Y::Y( X& p ) : pX( p )
{
}
Y::Y( const Y& r ) : pX( r.pX )
{
}
int Y::Value1() const
{
return pX.data1;
}
void Y::Value1( int data )
{
pX.data1 = data;
}
int Y::Value2() const
{
return pX.data2;
}
void Y::Value2( int data )
{
pX.data2 = data;
}
int main()
{
int number1 = 0, number2 = 0;
// const X x( 5, 10 );
X x( 5, 10 );
number1 = x.Get().Value1();
number2 = x.Get().Value2();
x.Set().Value1( 50 ); // error if you declare const X x( 5, 10 )
x.Set().Value2( 100 ); // error if you declare const X x( 5, 10 )
number1 = x.Get().Value1();
number2 = x.Get().Value2();
return 0;
}
Is copy constructor in class Y safe?
class Y;
class X
{
friend class Y;
public:
X( int data1, int data2 );
Y Get() const;
Y Set();
private:
int data1;
int data2;
};
class Y
{
public:
Y( X& p );
Y( const Y& r );
int Value1() const;
void Value1( int data );
int Value2() const;
void Value2( int data );
private:
X& pX;
};
X::X( int data1, int data2 ) : data1( data1), data2( data2 )
{
}
Y X::Get() const
{
return Y( const_cast< X& >( *this ));
}
Y X::Set()
{
return Y( *this );
}
Y::Y( X& p ) : pX( p )
{
}
Y::Y( const Y& r ) : pX( r.pX )
{
}
int Y::Value1() const
{
return pX.data1;
}
void Y::Value1( int data )
{
pX.data1 = data;
}
int Y::Value2() const
{
return pX.data2;
}
void Y::Value2( int data )
{
pX.data2 = data;
}
int main()
{
int number1 = 0, number2 = 0;
// const X x( 5, 10 );
X x( 5, 10 );
number1 = x.Get().Value1();
number2 = x.Get().Value2();
x.Set().Value1( 50 ); // error if you declare const X x( 5, 10 )
x.Set().Value2( 100 ); // error if you declare const X x( 5, 10 )
number1 = x.Get().Value1();
number2 = x.Get().Value2();
return 0;
}