使用构造函数类制作现有类实例的副本

凯文·切伦奇克

我是OOP的新手,所以请多多包涵。我在使用类构造函数复制现有类时遇到问题。下面是一个示例,其中我创建一个类的初始实例,使用类构造函数对其进行复制,然后在该初始类中修改属性值。这还会修改复制的类中的相同值,这不是我想要实现的行为。(我希望它保留为修改之前存在的初始类。)在此先感谢您的帮助!

class Program
{
    static void Main(string[] args)
    {
        // Make initial instance, make a copy, and write the copied values to console
        myClass myInitialInstance = new myClass();
        myClass myOtherInstance = new myClass(myInitialInstance);
        Console.WriteLine("Copied Instance: {0}, {1}, {2}", myOtherInstance.Input1[0], myOtherInstance.Input1[1], myOtherInstance.Input1[2]);

        // Make change to initial instance
        myInitialInstance.Input1 = new double[] { 10, 10, 10 };

        // Notice in the display that myOtherInstance inherits the {10,10,10} values from myInitialInstance
        Console.WriteLine("Initial Instance: {0}, {1}, {2}", myInitialInstance.Input1[0], myInitialInstance.Input1[1], myInitialInstance.Input1[2]);
        Console.WriteLine("Copied Instance: {0}, {1}, {2}", myOtherInstance.Input1[0], myOtherInstance.Input1[1], myOtherInstance.Input1[2]);
        Console.ReadKey();

    }
}

public class myClass
{
    public double[,] AllPoints { get; set; }
    public double[] Input1 { get { return GetRow(0); } set { SetRow(0, value); } }
    public double[] Input2 { get { return GetRow(1); } set { SetRow(1, value); } }

    private double[] GetRow(int i) { return new double[] { AllPoints[i, 0], AllPoints[i, 1], AllPoints[i, 2] }; }
    private void SetRow(int i, double[] value)
    {
        AllPoints[i, 0] = value[0];
        AllPoints[i, 1] = value[1];
        AllPoints[i, 2] = value[2];
    }

    public myClass() { AllPoints = new double[2, 3]; }

    public myClass(myClass anotherInstance) { AllPoints = anotherInstance.AllPoints; }
}

上面的代码产生以下输出:

复制实例:0,0,0初始实例:10,10,10复制实例:10,10,10

我希望输出如下:

复制实例:0,0,0初始实例:10,10,10复制实例:0,0,0

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

当前,您的副本构造函数仅将的引用分配给正在创建anotherInstance的当前实例MyClass这导致这样一个事实,即新创建的类指向原始数组时,对原始数组的任何更改都将可见您实际要做的是在复制构造函数中复制数组

public MyClass(MyClass anotherInstance) 
{
    Array.Copy(anotherInstance.AllPoints,
               this.AllPoints, 
               anotherInstance.AllPoints.Length); 
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用COM的参数化构造函数实例化类

来自分类Dev

多态类中没有隐式副本构造函数?

来自分类Dev

具有移动构造函数和分配的类的默认副本构造函数和分配

来自分类Dev

基类“ QAbstractListModel”具有私有副本构造函数

来自分类Dev

实例化没有构造函数的类

来自分类Dev

常量类成员副本构造函数

来自分类Dev

无法实例化类...没有空的构造函数

来自分类Dev

如何使用基本构造函数实例化继承的类?

来自分类Dev

具有隐藏构造函数的抽象类的实例

来自分类Dev

在基类中使用带有无参数构造函数的Activator创建Class的实例

来自分类Dev

具有参数副本构造函数的C ++模板类

来自分类Dev

类型类实例化中的现有常量(例如,构造函数)

来自分类Dev

clang vs gcc运行时差异:c ++类模板,使用clang生成,没有复制构造函数崩溃,g wcc,使用副本构造函数崩溃

来自分类Dev

如何使用超类的构造函数创建子类的实例

来自分类Dev

使用Java / Mockito / PowerMockito用私有构造函数实例化一个类

来自分类Dev

错误:基类“ A1”具有私有副本构造函数

来自分类Dev

C ++类副本构造函数没有匹配功能

来自分类Dev

使用构造函数或没有构造函数导出类

来自分类Dev

使用带有另一个类似类的参数的辅助构造函数创建数据类实例

来自分类Dev

使用COM的参数化构造函数实例化类

来自分类Dev

如何实例化使用构造函数扩展类的特征

来自分类Dev

隐藏抽象基类的副本构造函数

来自分类Dev

如何调用父类副本构造函数?

来自分类Dev

通过使用不同的构造函数创建类的实例

来自分类Dev

Matlab类在构造函数中具有实例名称的知识

来自分类Dev

以最小的影响向现有类添加构造函数

来自分类Dev

使用不同的构造函数为不同的类创建实例

来自分类Dev

类构造函数 - 没有构造函数的实例

来自分类Dev

创建具有私有构造函数的类模板的实例

Related 相关文章

  1. 1

    使用COM的参数化构造函数实例化类

  2. 2

    多态类中没有隐式副本构造函数?

  3. 3

    具有移动构造函数和分配的类的默认副本构造函数和分配

  4. 4

    基类“ QAbstractListModel”具有私有副本构造函数

  5. 5

    实例化没有构造函数的类

  6. 6

    常量类成员副本构造函数

  7. 7

    无法实例化类...没有空的构造函数

  8. 8

    如何使用基本构造函数实例化继承的类?

  9. 9

    具有隐藏构造函数的抽象类的实例

  10. 10

    在基类中使用带有无参数构造函数的Activator创建Class的实例

  11. 11

    具有参数副本构造函数的C ++模板类

  12. 12

    类型类实例化中的现有常量(例如,构造函数)

  13. 13

    clang vs gcc运行时差异:c ++类模板,使用clang生成,没有复制构造函数崩溃,g wcc,使用副本构造函数崩溃

  14. 14

    如何使用超类的构造函数创建子类的实例

  15. 15

    使用Java / Mockito / PowerMockito用私有构造函数实例化一个类

  16. 16

    错误:基类“ A1”具有私有副本构造函数

  17. 17

    C ++类副本构造函数没有匹配功能

  18. 18

    使用构造函数或没有构造函数导出类

  19. 19

    使用带有另一个类似类的参数的辅助构造函数创建数据类实例

  20. 20

    使用COM的参数化构造函数实例化类

  21. 21

    如何实例化使用构造函数扩展类的特征

  22. 22

    隐藏抽象基类的副本构造函数

  23. 23

    如何调用父类副本构造函数?

  24. 24

    通过使用不同的构造函数创建类的实例

  25. 25

    Matlab类在构造函数中具有实例名称的知识

  26. 26

    以最小的影响向现有类添加构造函数

  27. 27

    使用不同的构造函数为不同的类创建实例

  28. 28

    类构造函数 - 没有构造函数的实例

  29. 29

    创建具有私有构造函数的类模板的实例

热门标签

归档