Suppose we have the C# code below that stores an instance of class A in class B. I want to create a version of class B that stores its own A. So when we change A outside of B, the internal A object in B doesn't change.
class Engine
{
public int Horesepower = 500;
}
class Vehicle
{
public Vehicle( Engine engine ) { Engine = engine; }
public Engine Engine;
}
class Program
{
static void Main( string[ ] args )
{
Engine v8 = new Engine( );
Vehicle monsterTruck = new Vehicle( v8 );
v8.Horesepower = 1000; // this changes the field Engine in yugo as well
Console.WriteLine( monsterTruck.Engine.Horesepower ); // prints 1000 instead of 500
}
}
I can avoid this problem in C++ by using a templated bridge class that clones A when passing A into B. But apparently deep clones doesn't seem as widely used in C# for some reason(why?). Can anyone provide a good way around this storing problem.
C++ code:
template <typename T>
class Wrapper{
public:
Wrapper(const Wrapper<T> &orig){if(orig.data!=nullptr)data = orig.data->clone();}
Wrapper(const T &origdata){data = origdata.clone();}
Wrapper & operator=(const Wrapper<T> &orig){...}
...
~T(){delete data;}
private:
T *data;
}
class A{
public:
A():data(9){}
int data;
A *clone(){return new A(*this);}
}
class B{
public:
B(const Wrapper<A>& a_):ainner(a_){}
Wrapper<A> ainner;
}
int main(){
A a;
B b(a);
a.data =20;
std::cout << b.ainner.data; // prints 9 still
return 0;
}