Daha önce benzersiz ptr'leri kullanma hakkında bir sorum var. Yalnızca taşıma nesnelerini kullanmasını öneren this answer alırım. Ben aşağıdaki gibi bir sınıf tanımlamıştır:C++ 11'deki yalnızca nesne nesnelerini tanımlamak için bir nokta var mı?
class B {
const string objName;
public:
B (B &&) = default;
B & operator= (B &&) = default;
B (const B &) = delete;
B & operator= (const B &) = delete;
B(const string & name) :
objName(name) {
}
virtual ~B();
const string name() const { return objName;};
}
ve bu çizgilerle B olarak adlandırılan:
class A {
A(){}
void take(B b);
}
A a;
B b("test");
cout<<b.name();
a.take(std::move(b));
cout<<b.name();
Benim sorular: Ben hareket yapıcısı yapmayan bile
- Yapamam a.take (b) yazıp derleme hatası alıyorum. Kopyalama aracının silindiğini anlıyorum ama mantıksal bir seçim, std :: use a.take (b)
- gibi bir harekete ihtiyaç duyulmadan varsayılan olarak yapılandırıcıyı kullanmaktır. Sonuçta "test" iki kez yazdırılır. Arama yapıldıktan sonra neden b nesnesi kaldırılmamış? Eğer b nesnesi hala mevcutsa ve bir kopyası a.take'ye gönderilirse (move (b)), bu demektir ki, rivalue nesneler için herhangi bir hareketimiz yoktur.
- Yalnızca taşıma nesnelerini yukarıdaki gibi kullanmak iyi bir uygulamadır (Kopya oluşturucu ve atama işlecini kaldırma ve yapıcıyı varsayılan olarak taşı ve ödevi taşıma).
daha uzun bir dize ile "test" değiştirmeyi deneyin ve neler olacağını görün. Genel olarak, taşınan nesnenin değeri belirsizdir; eski değer olabilir ya da olmayabilir. –
Eğer ondan taşımak istiyorsanız 'const'' 'objectName' 'den kaldırmanız gerekir. –
@AlanStokes kaldırma konsolu, bu sınamanın bir kez yazdırılmasına neden olur. Bu, const üyelerinin asla taşınmayacağı anlamına mı geliyor? Yoksa kopyalanacaklar mı? – Govan