2009-12-20 31 views
8

Dinamik olarak ayrılmış belleğe işaretçi barındıran bir sınıf için bir kopya oluşturucu yazarken, bir sorum var.Kopya kopyalama - işaretçi değeri kopyalama

Kopyalanan öğenin işaretçisinin değerinin, kopyalanan nesnenin işaretçisine kopyalanmasını istediğinizi nasıl belirleyebilirim. Açıkçası böyle bir şey ... çalışmıyor

*foo = *bar.foo; 

çubuk nesnesi (ilk etapta nesneyi kopyalama amacını) silinirken, ve bu sadece nesnenin foo noktasına kopyalanan etmiştir, çünkü ayni yer.

Burada çözüm nedir? Dinamik olarak ayrılmış belleğin değerini nasıl alabilirim ve farklı bir adrese nasıl kopyalarım?

+0

Soru hiçbir mantıklı. Lütfen, ne istediğinizi açıklayan daha fazla kod yayınlayarak, onu yeniden biçimlendirmeyi deneyin. –

+0

Daha fazla bilgiye ihtiyacınız var: foo'nun türü iyi olurdu. Diğer üyeler. Akıllı bir işaretçi kullanmadığınızı gösteren bir açıklama? –

+0

Bu dizi ile ilgili fırsatlar ancak yararlı olabilir: http://stackoverflow.com/questions/255612/c-dynamically-allocating-an-array-of-objects/255744#255744 –

cevap

18

Ben senin sınıf şöyle olduğunu varsayalım

class Foo 
{ 
    Foo(const Foo& other) 
    { 
     // deep copy 
     p = new int(*other.p); 

     // shallow copy (they both point to same object) 
     p = other.p; 
    } 

    private: 
     int* p; 
}; 
1

İçeriği görmüyorum, ancak gönderdiğiniz kod, işaretçiyi kopyalamak gibi görünmüyor, tam olarak sizin için ne soruyorsunuz? Foo, ayrılan nesneye işaret ettiği sürece.

2

yeni nesne tahsis. Derin bir kopyasını yapmak için

class Bar { 
    Foo* foo; 
    ... 
} 

, sen 'bar.foo' tarafından başvurulan nesnenin bir kopyasını oluşturmak gerekir.

Bar(const Bar & bar) 
{ 
    this.foo = new Foo(*(bar.foo)); 
} 

Not: C++ sadece sınıf Foo kopya kurucu çağırmak için new operatörünü kullanarak bunu bu çözüm delege kopya yapıcısı yeni Foo (constFoo &) aynı zamanda bir 'derin yapar olmadığı kararı 'Foo sınıfının uygulanmasına' kopyalayın ... basitlik için 'doğru şey' olduğunu varsayalım!

[Not ... yazılan soru çok kafa karıştırıcıdır - bana 'kopyalanan nesnenin işaretçisinin değeri' diye soran derin bir kopya gibi gelmiyor: bu sığ bir kopyaya benziyor yani bu.

Bar(const Bar & bar) 
{ 
    this.foo = bar.foo; 
} 

Bu asker adına sadece masum karışıklık olduğunu varsayalım, ve derin bir kopyası istediği budur.]