C#クラスのコピー方法について

このQ&Aのポイント
  • C#の開発において、クラスのコピー方法について質問です。具体的には、Copyメソッドを使って値だけを別のインスタンスに渡す方法について知りたいです。
  • C#の開発で、クラスのコピーにはCloneメソッドを使うことが一般的です。しかし、Cloneメソッドでは新しいインスタンスを作成するため、値だけを別のインスタンスに渡すことが難しいです。
  • そこで、Copyメソッドを新たに定義する方法があります。Copyメソッドでは、引数として渡されたインスタンスに値をコピーする処理を行います。この方法を使うことで、値だけを別のインスタンスに渡すことが可能になります。
回答を見る
  • ベストアンサー

C# クラスのコピー

VisualStudio2013 でC#を使って開発を行っています。 クラスのコピーについて質問させてください。     public class Config     {       public int H;       public int V;       public object Clone()       {         return MemberwiseClone();       }     }     public class Test     {       void Hoge()       {         Config org = new Config();         org.H = 10;         org.V = 20;                  Config copy;         copy = (Config)org.Clone();       }     }      このように記述した際にcopy とorgが別インスタンス?(アドレス?)を指していることは理解できています。 この場合、Clone()を読んだ際にnewされるイメージですが、 先にnewしたインスタンスに値だけを渡す方法はありますでしょうか?         Config copy = new Config();         // copy = org; // orgの中の値だけをcopyへ渡したい class Config に       public void Copy(Config cfg)       {         cfg.H = this.H;         cfg.V = this.V;       } と記述して、Clone()の代わりにすれば実現できるかなと思うのですが、実際は複雑なクラスの為うまいやり方がないかと思いました。 間違いやアドバイス等ありましたらなんでも良いのでお願いします。 よろしくお願いします。

  • fenri
  • お礼率50% (11/22)

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

コピーコンストラクタをConfigに作ればいいかと Copyメソッドを作るのであれば 引数を ref引数にするとか … // コピーコンストラクタ public Config(ref Config src) {   this.H = src.H;   this.V = src.V; } // ref引数の Copyメソッド … public void Copy(ref src) {   src.H = this.H;   src.V = this.V; } といった具合で …

fenri
質問者

補足

ありがとうございます。 それも考えたのですが、今あるクラスが複雑で   src.H = this.H;   src.V = this.V; といった具合に一つずつ書いていくには量が多い為、値だけ渡せないかと思ったんです。 地道に一つずつ書いていくしかないですかね。

関連するQ&A

  • C++ クラスをメンバにもつクラスについて

    お世話になります。C++初心者でうまくコードが書けません(><) クラス1と2があり、クラス1のメンバにはクラス2があります。 メインでクラス1をインスタンス化してクラス2のfunc2を呼び出します。 func2ではクラス1のインスタンスから呼び出された場合にクラス1の m_int1を取得します。 Class Class1{ public:  int m_int1;  Class2 m_Class2; }; Class Class2{ public: void func2(); }; void Class2::func2(){  /*ここの記述方法が分かりません*/  /*C1から呼び出されたらC1のm_int1に100を入れる*/  /*以下間違え*/  class1 C2_1;/*別のclass1のオブジェクトなのでこれに入れてもダメっぽい*/  C2_1.m_int1 = 100; } void main(){  class1 C1;  C1.m_int1 = 10;  C1.m_class2.func(); } C1.m_class2.func()の中から呼び出したC1にアクセスする方法が 分かりません(TT)。実体がまだあるのだからアクセスする方法は あると思うのですが・・・ どなたかよろしくお願いします。

  • Java クラスを使ったソート

    Javaで隣接交換法を用いて配列dataを昇順に並び替え、出力するプログラムを作成する。 ただし、ループ処理には、int型の変数は使わず、以下のCounterクラスを使用する。 という課題が出て、とり組んでみたのですが所々よく分からないので、お力添えしていただければと思います。 課題には下記のような条件が書いてありました。 配列data={54,76,32,89,45,11,8,54,29,67}; [クラス] Counter [インスタンス変数] int型の値を保持するcount [コンストラクタ] 引数で渡された値を初期値としてインスタンス変数に設定する。 引数を省略された場合、ゼロを設定する。 [メソッド] increment 値に1加算する decrement 値に1減算する compareTo 以下の処理を行う Counterの保持している値が引数に指定された値と 等しい場合、値0を返す。 Counterの保持している値が引数に指定された値より 小さい場合、0より小さい値を返す。 Counterの保持している値が引数に指定された値より 大きい場合、0より大きい値を返す。 get Counterの保持している値を添え字として、 引数で渡された配列の要素を取得します。 set Counterの保持している値を添え字として、 第1引数で渡された配列に第2引数で渡された値を設定します。 以下組んだものです。 ---- class Counter { int count = 0; Counter(int count) { this.count = count; } Counter() { this.count = 0; } public int get(int[] data) { return this.count; } public void set(int[] data, int count) { this.count = count; } public void increment() { this.count = count + 1; } public void decrement() { this.count = count - 1; } public int compareTo() { return count; } } public class Lesson09 { public static void main(String args[]) { Counter counter = new Counter(0); int[] data = {54, 76, 32, 89, 45, 11, 8, 54, 67}; counter.get(data); counter.set(data, 0); } } ---- とりあえず、compareToとsetとgetの部分をどう記述していいのかがよく分かりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    はじめまして。Javaをはじめて3か月の超初心者です。 早速ではございますが、質問をさせていただきます。 以下のサンプルで、 class Foo { private int i = 0; Foo(int i) { this.i = i; } void func1() { System.out.println(this.i); } void func2(Foo foo) { System.out.println(foo.i); } } class Main { public static void main(String[] args) { Foo obj1 = new Foo(100); Foo obj2 = new Foo(500); obj1.func1(); obj1.func2(obj2); } } privateフィールドのスコープは同一クラス内からしか アクセスできないと参考書には記述されているの ですが、そのクラス内に上のサンプルのように this.iやfoo.iというように、クラスは同じでも インスタンスが異なるものがiにアクセスするとき、 上のサンプルは、どちらもアクセス制限のエラーが表 示されません。なぜなのでしょうか? this.iというアクセスは、現在実行中のインスタン ス内でのアクセスなので、privateスコープ内での アクセスであるというような感じがするのですが、 foo.iというアクセスの方は、現在実行中のインスタンスとは異なるインスタンス内でのアクセスなので、 privateスコープからはずれているような感じがして なりません。

    • ベストアンサー
    • Java
  • 内部クラス?のエラー

    内部クラス?のエラー  今晩は、JAVA初心者です、宜しくお願い致します。  下のようなプログラムを書いてやりました。  <A>のように全体のプログラムを1つのクラスの中に別のクラスを入れる(内部クラス?)と、 「アクセス可能な型Testのエンクロージング・インスタンスがありません。  型Testのエンクロージング・インスタンスで割り振りを限定する必要があります。  (例えばx.new A()でxはテストのインスタンス)」というエラーがでます。  しかし、<B>のように別のクラスにすると、エラーは出ません。  この原因がよくわかりません。 ==================================================================== <A> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } } ==================================================================== <B> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } ====================================================================

    • ベストアンサー
    • Java
  • cloneメソッドはシャローコピー?

    質問させてください。 ネットを見ると、cloneメソッドはシャローコピーをするものだと認識できます。 しかし、以下のコードを実行すると、配列cnum[0]とnum[0]の値が異なる結果になり、ディープコピーを行っているように見えます。 public class Hairetu { public static void main(String[] args) { int []num={1,2,3}; int []cnum=new int[3]; int []dnum=new int[3]; cnum=num.clone(); cnum[0]=12; for(int i=0;i<3;i++) { System.out.println(cnum[i]+" "+num[i]); } } } cloneメソッドはディープコピーなのでしょうか。 どなたか教えてください。お願いします。

    • ベストアンサー
    • Java
  • C#でのオブジェクトのコピーについて

    visual studio 2008 express edition C#3.5 を使用しています。 参照渡しではなく値渡し(コピー元が影響されない)でオブジェクトをコピーしたいと思い、 次のようなかんじで深いコピーを行ったのですが、 tc1.cc1.i(リストを使用しない方)変更されなかったのですが tc1.cc2[0].i(リストを使用した方)は変更されてしまいます・・・ どこが原因で、リストを使用する場合はどのように記述すれば良いのでしょうか? public class TestClass { public int n; public ChildClass1 cc1 = new ChildClass1(); public List<ChildClass2> cc2 = new List<ChildClass2>(); public object DeepCopy() { TestClass tc = (TestClass)Clone(); tc.cc1 = (ChildClass1)cc1.Clone(); for (int i = 0; i < cc2.Count; i++) { tc.cc2[i] = (ChildClass2)cc2[i].Clone(); } return tc; } private object Clone() { return MemberwiseClone(); } } public class ChildClass1 : ICloneable { public int i; public object Clone() { return MemberwiseClone(); } } public class ChildClass2 : ICloneable { public int i; public object Clone() { return MemberwiseClone(); } } TestClass tc1 = new TestClass(); tc1.cc1.i = 1; ChildClass2 cc2 = new ChildClass2(); cc2.i = 1; tc1.cc2.Add(cc2); TestClass tc2 = (TestClass)tc1.DeepCopy(); tc2.cc1.i = 2; tc2.cc2[0].i = 2; System.Windows.Forms.MessageBox.Show("cc1.i = " + tc1.cc1.i + " cc2[0].i = " + tc1.cc2[0].i);// cc1.i = 1 cc2[0].i = 2←変更されてしまう

  • クラスのインスタンス

    お世話になります クラスのインスタンスを生成する際に class CTest { int m_i; } CTest* pTest = new CTest; void main() { pTest->m_i = 0; } CTest::~CTest() { delete pTest; } と、関数外でインスタンス化する際にも、newを使用するのでしょうか? もう1つ、newを使用しないで CTest Test; CTest* pTest = &Test; とするのと、何が違うのでしょうか? 多分、根本的な所が理解できていないと思われますが、よろしくお願い致します

  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • クラスインスタンスとクラス型変数の配列

    C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。 最初にC++のサンプルを書かせていただきます。 ----- C++ ----- class Hoge {  /* 実装省略 */ } int main( void ) {  Hoge *hoge = new Hoge ;  Hoge *hoge = new Hoge[10] ; } --------------- これをJAVAで実装した場合、以下のようになると思います。 ----- JAVA ----- class Hoge {  /* 実装省略 */ } class Test {  public static void main( String[] args )  {   Hoge hoge = new Hoge() ; /* 1 */   Hoge[] hoge = new Hoge[10] ; /* 2 */  } } --------------- JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。 そうすると、 int[] a = new int[10] ; と、 Hoge[] hoge = new Hoge[10] ; のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。 私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • C#でクラス継承について

    下記のようなコードは、可能なのでしょうか? // クラス定義 abstract class Base { int a; Public int A { get{ return a; } } } class Sub1 : Base { int b; public int B { set { b = value; } } }; class Sub2 : Base { // 中略 } static class Program { [STAThread] static void Main(string [] args) { Base aaa = new Sub1(); Base bbb = new Sub2(); func(aaa); // ここでCS1502, CS1503 func(bbb); // ここでCS1502, CS1503 } void func(Sub1 _aaa) { // 中略 } void func(Sub2 _bbb) { // 中略 } } コメントに書いたとおり、CS1502(引数が合わない)が出ます。 func((Sub1)aaa); の様にキャストしないと、動作させることは難しいでしょうか? ※ 実際のコードでは、func(aaa), func(bbb)の呼び出し部分をループでまわしたいと考えています。