Bir obyekti sıfıra qoymaq mümkündürmü?

Sonra, kodumda, obyektin boş və ya boş olduğunu yoxlamaq üçün yoxlayıram.

Sıfıra obyekt qoymaq üçün bir yol varmı?

33
13 июня '10 в 5:12 2010-06-13 05:12 John , 13 İyun 'da 5:12' də təyin olundu. 2010-06-13 05:12
@ 5 cavab

Sınıf obyekti NULL olaraq təyin edilə bilməz; ancaq göstəriciyi (obyektin yaddaş ünvanını ehtiva edən) NULL olaraq təyin edə bilərsiniz.

Nə etməli olduğunuzdan nə soruşduğunuzun nümunəsi:

 Cat c; c = NULL;//Compiling error 

Nə edə biləcəyinizə bir nümunə:

 Cat c; //Set p to hold the memory address of the object c Cat *p =  //Set p to hold NULL p = NULL; 
40
13 июня '10 в 5:13 2010-06-13 05:13 Brian R. Bondy üçün 13 iyun '10, saat 05:13 'də 2010-06-13 05:13 cavab verdi

C ++ 'da bir obyektin "boş / boş" ola bilməməsi doğru olsa da, C ++ 17-də bu niyyəti ifadə etmək üçün std::optional olaraq alındı.

İstifadə nümunəsi:

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

Sonra optional bir dəyərin olub olmadığını kontrol edə bilərsiniz

 v1.has_value(); // false 
border=0

və ya

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

Normal bir int (və ya hər hansı digər növü) heç bir faydalı mənada heç vaxt "null" və ya "boş" ola bilməz (bu sözlərin tərifi ilə). std::optional olaraq bir konteyner olaraq düşünün.

Əlinizdə C ++ 17 uyğun kompilyatorunuz yoxdursa, bunun yerinə boost.optional istifadə edə bilərsiniz. C ++ 17-dən əvvəl bəzi kompilyatorlar da std::experimental::optional təklif edirlər ki, bu da ən azı faktiki std::optional afaikə yaxın olacaqdır. Derivat kitabçasındakı detalları nəzərdən keçirin.

7
26 янв. cavab 26 yanvarda Baum mit Augen verilir . 2018-01-26 04:17 '18 də 4:17 2018-01-26 04:17

NULL / boş olduğunu yoxlamaq istəsəniz. NULL və boş olmaq eyni deyil. Justin və Bryan qeyd etdiyimiz kimi, C ++-da NULL siz göstəricilərlə əlaqəli tapşırıqdır. Bəlkə də, operatoru çox yükləyə bilərsiniz, amma bunu həqiqətən etmək istəyirsən. Digər bir neçə şey:

  • C ++-da NULL göstəricisi bir "boş" obyektə işarə edən göstəricidən çox fərqlidir.
  • Niyə sıfırlama obyektinin dəyişənləri u mənim vəziyyətlə əlaqəli olduqda, həqiqəti qaytaran bool IsEmpty() metodunu istifadə etməyin? NULL-in istifadəsini atlata biləcəyini tahmin edin.
  • A* p = new A; ... p = NULL; kimi A* p = new A; ... p = NULL; şey var A* p = new A; ... p = NULL; A* p = new A; ... p = NULL; kodunuzun zibil yığdığına təminat verə bilməyəcəyiniz təqdirdə (pislənmədən) pisdir. Bir şey varsa, bu bir yaddaş sızıntısına və bir neçə belə sızıntıya səbəb olacaq, yaxşı bir kodunuz olacaq.
  • class Null {}; Null _NULL; ilə bunu edə bilərsiniz class Null {}; Null _NULL; class Null {}; Null _NULL; sonra operatoru = operatorunu yenidən yükləyin! = vəziyyətinizə bağlı olaraq başqa dərslər.

Bəlkə 4 variant ilə daha yaxşı kömək edəcək kontekstə dair bəzi detallar barədə danışmalısınız.

Arpan

4
13 июня '10 в 6:27 2010-06-13 06:27 Cavab Fanatic23 tərəfindən 13 iyun 'da saat 06 : 27- də 2010-06-13 06:27

NULL sadəcə C ++-da 0 olaraq təyin olunmasına baxmayaraq, hər hansı bir göstəricini NULL təyin edə bilərsiniz:

 myObject *foo = NULL; 

Ayrıca, standart başlıqları daxil etdiyiniz halda, NULL müəyyən edilir, lakin dilin özündə yerləşdirilmir. NULL müəyyən edilmədikdə, 0 əvəzinə istifadə edə bilərsiniz və ya onu aktivləşdirə bilərsiniz:

 #ifndef NULL #define NULL 0 #endif 

Bundan başqa, bir göstərici deyil, bir obyekt təyin etmək istəyirsinizsə, NULL üçün Nümunə null obyektini oxuya bilərsiniz.

3
13 июня '10 в 5:15 2010-06-13 05:15 Cavab Justin Ardini tərəfindən 13 iyun '10 'da saat 05:15 ' də 2010-06-13 05:15 'də verilir

Hansı növ "obyekt"?

Əlbəttə, NULL (və nullptr ) pointer tipli obyektlərə təyin edə bilərsiniz və bu arifmetik növlərin obyektlərinə NULL təyin edə bilərsiniz, əgər bu tətbiqə bağlıdır.

Bəzi sinif tipli obyektlər deməkdirsə, cavab NO ( operator= işarə və ya aritmetik tipləri qəbul edən dərslər istisna olmaqla)

"Boş" daha çoxdur, çünki bir çox növdə bir surət hədəfi və bir default qurğu (tez-tez örtülü) var. Mövcud bir obyektin bir default kimi olub olmadığını görmək üçün müvafiq bool operator== lazımdır

0
26 янв. Caleth 26 yanvar göndərdi 2018-01-26 17:21 '18 də 5:21 'də 2018-01-26 17:21

haqqında digər suallar və ya bir sual