2010-06-13 37 views
30

Kodumda, bir nesnenin boş/boş olup olmadığını kontrol etmeyi kontrol ediyorum. Nesneyi null olarak ayarlamanın bir yolu var mı?Bir nesneyi null olarak ayarlamak mümkün mü?

+3

Sen (siz null işaret olmadığını kontrol etmek istediğinizde veya yok senin terminoloji konusunda dikkatli olmalıdır nesne eğer kendisi null?) Yönetilen bir dilden geliyormuşsunuz gibi geliyor. C++ nesneleri asla boş veya boş olamaz. İşaretçiler, hiçbir şeye işaret etmediklerini gösteren boş bir işaretçi değeri tutabilir. Referanslar her zaman bir nesneye başvurur. Kendini başka dillerden gelen bilgilerle öğretmeyi denemem, kendini inciteceksin. Yeni başlayanlar için iyi bir kitap tut, öğrenmenin en iyi yolu. http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list – GManNickG

cevap

34

Sınıfın nesnesi NULL olarak ayarlanamaz; Ancak, bir işaretçiyi (bir nesnenin bir hafıza adresini içeren) NULL olarak ayarlayabilirsiniz.

yapamayacağınız şeylerin Örnek hangi soruyorsun: Eğer yapabileceklerinizin

Cat c; 
c = NULL;//Compiling error 

Örnek: NULL basitçe olsa

Cat c; 
//Set p to hold the memory address of the object c 
Cat *p = &c; 
//Set p to hold NULL 
p = NULL; 
+8

kim getirmek istiyorsa bir yana, evet operatöre aşırı yükleyebilirsiniz = ancak bu OP değil istiyor. –

+1

İlk, “Cat :: operator = (...)' ile çalışabilir. Her neyse, OP gerçekten bir işaretçiyi kontrol etmek istiyor gibi görünüyor. Yani, +1. – jweyrich

+1

@jweyrich: Birisinin bunu söylemesinden önce yorumumu görebileceğini anladım :) –

3

Sen NULL herhangi işaretçi ayarlayabilirsiniz C++ 0 olarak tanımlanır:

myObject *foo = NULL; 

dadikkat, standart üstbilgileri dahil ederseniz, ancak dilin kendisinde yerleşik değilse tanımlanır. NULL tanımsız, bunun yerine 0 kullanabilir veya bu içerebilir: Bir As

#ifndef NULL 
#define NULL 0 
#endif 

kenara, gerçekten NULL için, bir nesne değil, bir işaretçi ayarlamak istiyorsanız, Null Object Pattern okuyabilirsiniz.

3

Nesnenin boş/boş olup olmadığını kontrol etmek istersiniz. Boş ve boş olmaları aynı değildir. Justin ve Brian'ın daha önce de bahsettiği gibi, C++ NULL öğesinde, tipik olarak işaretçilerle ilişkilendireceğiniz bir ödevdir. Operatörü aşırı yükleyebilirsiniz = belki de bunu yapmak istiyorsanız gerçekten iyi düşünün. Diğer şeyler:

  1. C++ NULL işaretçisinde 'boş' nesnesini işaret eden işaretçiden çok farklıdır.
  2. Neden bir nesnenin değişkenleri varsayılan durumuna sıfırlanırsa true değerini döndüren bir bool IsEmpty() yöntemine sahip değil misiniz? Sanırım NULL kullanımını atlayabilir.
  3. A* p = new A; ... p = NULL; gibi bir şey olması, kodunuzun çöp toplanacağından emin olmadığınız sürece kötüdür (silme yok). Bir şey varsa, bu durum bellek sızıntılarına ve bu türden birkaç sızıntıya yol açacaksa, iyi bir şansınız olacaktır.
  4. Bunu yapmak için class Null {}; Null _NULL; ve daha sonra operatörünüze = ve operatör! = Durumunuza bağlı olarak diğer sınıflar yüklenebilir.

Belki bir nesne C++ "/ boş boş" olamaz seçeneği 4.

Arpan

+0

"Neden bir Boole IsEmpty() yöntemine sahip değilsiniz ..." - bazı iyi nedenler yoktur. En önemlisi, mantıklı olup olmadığının tipik olarak bağlamsal olması. Daha güçlü bir çözüm, geçerli bir T nesnesine sahip olup olmadığınızı belirtmek için 'boost :: isteğe bağlı ' işlevini kullanmaktır. Bu, sizin x.foo() 'x.IsEmpty() == true' – MSalters

5

o doğru olmakla birlikte daha size yardımcı olmak için bağlam hakkında bize bazı ayrıntıları gönderilmesi gerekiyor, C++ 17'de, bu amacı belirtmek için std::optional aldık.

örnek kullanım: optional

v1.has_value(); // false 

veya

if(v2) { 
    // You get here if v2 is not empty 
} 

bir düz int (veya herhangi bir tür) bir değer içeriyorsa,

std::optional<int> v1;  // "empty" int 
std::optional<int> v2(3); // Not empty, "contains a 3" 

Ardından, ancak kontrol edebilir Herhangi bir kullanımda asla "null" veya "boş" (bu sözcüklerin tanımına göre) olamaz ul duyu. Bu bağlamda std::optional'u bir kap olarak düşünün.

Elinizde C++ 17 uyumlu bir derleyiciniz yoksa, bunun yerine boost.optional'u kullanabilirsiniz. Bazı pre-C++ 17 derleyicileri de en az std::optional afaik'e yakın davranacak olan std::experimental::optional'u sunar. Ayrıntılar için derleyici kılavuzuna bakın.

+1

veya 'std :: experimental :: optional 'komutunu çağırırsanız, derleyiciniz bunu sağlar. –

+0

@JonathanWakely İyi nokta, bunu ekledi. Teşekkürler! –

0

Ne tür bir nesne?

NULL (ve nullptr) işaretçi türlerinin nesnelerine kesinlikle atayabilirsiniz ve aritmetik türlerin nesnelerine NULL atayabiliyorsanız uygulama tanımlanmıştır. Bazı sınıf türündeki nesneleri kastediyorsan

, cevap

"boş", gibi birçok çeşit daha makul olması kopya atama hem de HAYIR (operator= kabul işaretçi veya aritmetik türleri vardır hariç sınıflar) ise varsayılan yapım (genellikle zımnen). Varsayılan bir tane inşa gibi olan mevcut bir nesne, ayrıca gerekecektir olmadığını görmek için, uygun bir bool operator==

İlgili konular