gpt4 book ai didi

c# - c# - 如何让一个类对象存储另一个类对象?

转载 作者:行者123 更新时间:2023-11-30 14:54:14 25 4
gpt4 key购买 nike

假设我们有下面的 C# 代码,它在类 B 中存储类 A 的实例。我想创建一个类 B 的版本来存储它自己的 A。所以当我们在 B 之外更改 A 时,内部 A 对象在B不变。

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
}
}

在 C++ 中,我可以通过使用在将 A 传递给 B 时克隆 A 的模板化桥接类来避免这个问题。但显然,由于某些原因(为什么?),深层克隆在 C# 中似乎并未得到广泛使用。谁能提供解决此存储问题的好方法。

C++代码:

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;
}

最佳答案

使用 Clone() 只会在您克隆的对象包含值类型时满足您的需求,但通常(如您的示例中)您会有一个具有其他引用类型属性和浅表的类复制(通过 Clone() )将简单地复制一个引用。

您想要的是深拷贝,这可以通过在所有引用类型的属性上实现拷贝构造函数或通过序列化来实现。

序列化是执行深拷贝最简单的方法:Deep cloning objects

复制构造函数执行深复制示例:

class Engine
{
public Engine( ) { }
public Engine( Engine e ) { Horesepower = e.Horesepower; }

public int Horesepower = 500;
}
class Vehicle : ICloneable
{
public Vehicle( Engine engine ) { Engine = engine; }
public Vehicle( Vehicle v ) { Engine = new Engine( v.Engine ); }

public Engine Engine;

public object Clone( )
{
Vehicle newVehicle = new Vehicle( this );
return newVehicle;
}
}

关于c# - c# - 如何让一个类对象存储另一个类对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27723457/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com