2015-08-13 2 views
0

Я пришел с Java-стороны, где, если вы хотите проверить, выделена ли определенная запись в ArrayList, вы получаете ссылку на объект в ArrayList и проверяете, является ли оно нулевым или нет.Как проверить, является ли объект, на который указывает указатель, null?

В основном я пытаюсь выполнить одно и то же. Вот упрощенная версия моего кода:

struct node 
{ 
    int count=0; 
    int nodeval=0; 

    bool valid=false; 
}; 

bool operator==(const node* n,int val) 
{ 
    if (n->count==0&&n->nodeval==0&&n->valid==false) 
    if(val==NULL) 
     return true; 
    else 
     return false; 
} 

node* lookup(int val) 
{ 
    return &Table[val]; 
} 

int main() 
{ 
    res=somevalue; 
    node* child=lookup(res); 
    if(child==NULL) 
    { 
     //do something 
    } 
} 

Вот мое понимание:

  1. lookup() собирается вернуть мне адрес избранной позиции в структуре Таблица данных. Я храню это у ребенка.
  2. Проверка дочернего элемента для нулевого указателя не имеет смысла, потому что мы возвращаем правильную ссылку на ячейку памяти, чтобы перегрузить ее.
  3. В перегрузке == я проверяю, не изменилось ли каждое из полей, если оно не изменено и, следовательно, «нулевое сущность». Проблема в том, что оператору == требуется один пользовательский объект для работы.

Вопросы:

  1. Что я неправильно в передних упомянутых шагов?
  2. Есть ли более простой способ проверить, не изменился ли объект, на который указывает указатель/null?
+1

Почему вы перегружаете операторов? Просто проверьте, является ли указатель NULL или нет. Перегрузка оператора не требуется. Также - ** C++ не Java **.Не пытайтесь эмулировать Java-код или методы на C++. – PaulMcKenzie

+1

@PaulMcKenzie ,, когда я делаю & Table [val] Я имею в виду адрес (Таблица 0 + val), и это происходит как выделенная память, и я возвращаю его, теперь как это поможет мне проверить ноль? – BigDataScholar

+0

Что такое * Тип * Стол? – Galik

ответ

1

Это не 100% ясно, что ваш вопрос, но я попытаюсь прояснить некоторые заблуждения, которые я вижу в вашем коде:

  1. lookup() может возвращать нуль. Функция объявляется как возвращающая указатель, который может быть нулевым. Если это не ошибка (см. Ниже), просто верните нуль.

  2. Внутри lookup(), сначала вам нужно проверить, содержит ли Table элемент с этим индексом. Как это сделать, зависит от типа Table. Если это простой массив, просто проверьте, меньше ли размер индекса в элементах и ​​возвращает null, если нет.

Обратите внимание, что если вы всегда ожидаете результата поиска, возвращаемый тип должен быть ссылкой вместо указателя. Однако в этом случае вам нужна обработка ошибок для недопустимых индексов. Вы можете объявить их как ошибку программирования и только assert(), что они действительны. Кроме того, вы могли бы throw std::out_of_range("invalid index").

Наконец, что касается вашего вопроса «Как проверить, если объект, на который указывает указатель является недействительным?»: Ответ на этот вопрос в том, что если у вас есть указатель Object* ptr, вы просто разыменования указателя *ptr и сравните, что нуль (т.е. if (*ptr == 0)). Однако для этого требуется, чтобы тип объекта был сопоставим с нулем, что обычно относится только к числовым объектам (bool, char, int, float и т. Д.) И указателям. Объекты вашего класса узла обычно не сопоставимы с нулем, и нет смысла делать их сопоставимыми с нулевыми (с использованием перегрузки операторов).

Смежные вопросы