2013-03-28 6 views
4

Ok, пожалуйста, есть близкий осмотр моего кода ниже, его просто часть функцииСравнение с Null в C++

void RepeatWord(){ 
    system("cls"); 
    string word = NULL; 
    string newword = NULL; 
    int repeats = 0; 
    while(true){ 
     if(word == NULL){ 
      cout<<"Currently no word is stored.."; 
      cout<<"\n\nPlease enter a word: "; 
      cin>>word; 
     } 
.... 

я хорошо работал с другими языками программирования, и я всегда делал сравнение с значение NULL, но в C++ ... это, по-видимому, другая ситуация. Ошибка говорит ..

error: no match for 'operator==' in 'word == 0'

хорошо мне было интересно, я просто сравнивая с NULL, и я действительно не знаю, почему это неправильно. Сравнение значения с NULL с C++ отличается? пожалуйста, научите меня. Благодаря

Примечание: Я знаю больше, чем рубин Java

+1

Не устанавливайте 'std :: string' значение null (исключение будет выбрано при этом запуске). 'std :: string word;' - пустая строка. – chris

+3

Woah woah ... вы не можете нулевых объектов. Это не Java. – Mysticial

+0

@chris, так что действительно невозможно установить значения NULL в C++? –

ответ

7

Вы пытаетесь сравнить объект с NULL, Вы не можете сравнивать объекты с NULL. Вам нужно сравнить указатель. При этом вы проверяете, указывает ли указатель на то, что не является допустимым объектом.

В вашем случае вы хотите проверить, нет ли std::string. Вы можете использовать функции-члены, предоставленные std::string, std::string::empty().

Учитывая ваши вопросы, я подчеркиваю необходимость хорошей учебной книги:

The Definitive C++ Book Guide and List

+0

точка э? можете ли вы указать мне учебник, где я могу узнать, как использовать указатели? поэтому я могу установить значения «NULL»? –

+2

@Mahan точка C++ с stl заключается в том, что вам не нужны указатели. –

+1

@Mahan: Пожалуйста, возьмите хорошую книгу по ссылке, помеченной inline, чтобы ответить –

2

Если вы едете из мира Java, вы действительно обнаружите, что объект в C++ не обрабатываются так же, путь. В C++, если явно не указано, данные обрабатываются напрямую. В Java объект полностью управляется виртуальной машиной, и из-за этого имеет смысл разрешить программам доступ к ним только по ссылке. Следовательно, всякий раз, когда вы пишете программу Java, вы должны сообщить виртуальной машине о назначении объекта с помощью new и до тех пор, пока переменная экземпляров класса не назначит null. Следуя тому же принципу, если вы назначаете объектную переменную другому, оба будут ссылаться на на тот же объект, и вызов метода на любом вызове будет вызывать этот метод в одном и том же базовом экземпляре.

В C++ есть 2 различные механизмы для получения того же результата:

  • с использованием указателей, чей синтаксис для типа T является

    T *t; 
    

    так, что std::string *word; будет определять переменную с именем word проведение указатель на std::string.

  • используя ссылку:

    T &t; 
    

В C++, оба из них на самом деле типа, то есть. std::string, std::string *, std::string & - это три разных типа. Первый на самом деле обозначает само структурированное значение, а два других обозначает косвенное отношение к значению типа std::string.

Разница между этими типами направлений объясняется этим SO entry.

В вашем коде, вам придется либо заменить все вхождения NULL в пустой строке буквального "" или использование указателями и выделить экземпляры, используя new заявление, прежде чем пытаться использовать объект - как в строке cin >> word;.