C ++ -де нысандар бос болуы мүмкін бе?

Міне, мен не істедім: Менде қарапайым класс бар:

class Person{
  public:
    Person();
}

And in my main:

int main() {
  Person myPer = NULL;
}

Бұл мүмкін емес, себебі C ++ бұл мүмкіндік бермейді:

int main() {
  Person* perPtr = NULL;
  Person myPer = *perPtr;//corrected, it was &perPtr(typo error) before answers
}

Бұл жақсы компиляция жасайды және мен NULL объектісі бола алғанымды көрдім. C ++ белгішелері тек нөлге тең болмайтын ережені бұзбайды? Немесе C ++-де мұндай ереже бар ма? 2-ші код - осы кодты жазғаннан кейін, егер myPer - NULL немесе жоқ па екенін тексерсеңіз, мен if операторы қосылдым, бірақ бұл маған қате жіберді. NULL нысандарын жасау үшін не істесеңіз де, C ++ NULL объектінің идеясын ұнатпайтынын көрсетеді.

0
@Blastfurnace: Um ... нысандар Java-де null бола алмайды. сілтемелері объектісі null болуы мүмкін.
қосылды автор T.J. Crowder, көзі
Сіз сондай-ақ неге туралы «объект нөлге айналады» деп ойлауыңыз керек. Жиі (әрдайым емес, жиі емес) бұл мақсатты жоғалтудың белгісі және сіз сен деп ойлаған нәрсеге тіреле отырып, нақты мәселе әлдеқайда талғампаз шешімге ие болуы мүмкін.
қосылды автор Kerrek SB, көзі
Stack Overflow-қа қош келдіңіз! Егер сіз C ++ тілін үйреніп жатсаңыз, мен сізге осы маңызды кеңесті беремін: ол оны құрастырғандықтан, ол жарамды немесе ол жұмыс істеуі керек дегенді білдірмейді. Сондай-ақ, ол сіз ойлағандай құрастырылып, жұмыс істегендіктен, бұл да дұрыс емес дегенді білдірмейді. Ия, C ++ - өте қатал тіл :( Мен жақсы кіріспе C ++ кітапты ұсынамын.
қосылды автор R. Martinho Fernandes, көзі
«Бұл жақсы жасалады». Жоқ, олай емес. Сіз жасаған нақты бағдарламаны көшіруге (қоюға емес) көшіріңіз.
қосылды автор Robᵩ, көзі
@ TJ Crowder: түзету үшін рахмет.
қосылды автор Blastfurnace, көзі
Person myPer = & perPtr; - қате түрі. Person myPers = * perPtr; дегенді білдірдіңіз бе?
қосылды автор delnan, көзі
Ия, мен person myPers = * perPtr дегенді білдірдім; менде үлкен жауаптар бар, барлық рахмет ...
қосылды автор John Gunduz, көзі

7 жауаптар

Нысандар бос болмауы мүмкін, тек көрсеткіштер мүмкін. Сіздің кодыңыз дұрыс емес және компиляцияланбайды, себебі Person көрсеткіштен көрсеткішке Person мәнін инициализациялауға тырысады. Егер сіз кодты өзгерткіңіз келсе

Person* perPtr = NULL;
Person myPer = *perPtr;

онда Person инициализировать нөлдік көрсеткіштен тыс Person , бұл анықталмаған мінез-құлық (және ең алдымен апат).

Егер объектіңіз NULL күйінде болуы мүмкін идиомаларды пайдаланатын болсаңыз, Boost.Optional пайдалана аласыз:

boost::optional< Person > myPer = boost::none;
if( myPer )
{
    myPer->do_something();
}

Динамикалық бөлуді пайдаланбағаннан басқа, көрсеткішпен әдетте жасалатын нәрсені қорыту.

8
қосылды

This is undefined behaviour. C++ references cannot be legally set to NULL. If you want a "nullable reference", use a pointer.

4
қосылды

Бұл белгісіз мінез деп аталады. Күтпеген нәтиже NULL немесе NULL мекен-жайын алуға тырысқанда әрекет етуі мүмкін.

1
қосылды

C ++ рұқсат бермейтіндіктен, келесі мүмкін емес деп айта алмаймын:

int main() {
  Person myPer = NULL;
}

Мүмкін, және C ++ бұл мүмкіндік береді. Мұның барлығы Person деген сыныпты қалай анықтағаныңызға байланысты. Мысалы, егер Person сыныптары төменде көрсетілгендей конструкторы болса:

class Person
{
  public:
    Person(char *) {}
};

then Person myPer = NULL will compile just fine : http://www.ideone.com/586Pf

Енді сізге осындай сынып пайдалы болуы мүмкін. Жоғарыда келтірілген фактіні пайдалануға болады, және салқын және пайдалы (пайдалы) сыныпқа ие болуы мүмкін.

0
қосылды

«NULL» күйі бар сыныпты жасай аласыз.

Мысалы: мысалы, файлдың дескрипторы немесе терезенің дескрипторы немесе басқа ештеңе бар, ол бос болуы мүмкін немесе жоқ.

Оны кез-келген жол сыныбымен немесе контейнер сыныбымен көре аласыз.

егер (x.empty ()) ...

Бірақ «нөлдік» ұғымы көрсеткіштер мен ақылды көрсеткіштермен шектеледі (немесе мұндай пайдалану жағдайларын қолдауға көмектесетін кез-келген класс.

0
қосылды

Әдебиеттер негізінен синтаксистік нышандармен сөйлеудің жақсы тәсілі.

0
қосылды
Тек синтаксистен басқа шаш бар, бірақ тек шаш. Сілтеме заңды түрде NULL болуы мүмкін емес және оны қалпына келтіру мүмкін емес.
қосылды автор Mooing Duck, көзі
Мен жай ғана абай болдым, себебі сілтемелердің синтаксистік қант бар екендігін ойлайтын көптеген адамдар бар, содан кейін NULL көрсеткішін әрлендіруді аяқтайды.
қосылды автор Mooing Duck, көзі
Иә, демек «негізінен» ;-)
қосылды автор Michael Krelin - hacker, көзі
Менің жауапымның нүктесі сілтемелерді қалай пайдалану керектігі туралы емес, іс жүзінде болған туралы интуитивті түсінуді қамтамасыз етеді.
қосылды автор Michael Krelin - hacker, көзі

C ++ жүйесіндегі NULL объектісі болмайды. Сіздің бірінші әрекетіңіз көрсеткішке тең объект орнатуға тырысады, осылайша сәтсіздікке ұшырайды.

NULL көрсеткішіне ие бола аласыз, және сілтемелер сәл өзгеше синтаксисі бар жай көрсеткіш.

NULL көрсеткішін (мысалы, компиляторда сізге сілтеме ретінде) сілтеме жасауға болады, бірақ бұл анықталмаған мінез-құлық. Егер сіз бақытты болсаңыз, NULL-ке ауысыңыз, не болып жатқанын білесіз.

0
қосылды