c сравнить объект

#c

#c

Вопрос:

Я хочу сравнить с объектами, чтобы увидеть, совпадают ли они в C .

Если бы я сделал это на C #, это выглядело бы так:

 object result = human.find();
if (result == Human.NotFound) 
{ return ...
  

Как бы я это сделал на C ?

[править / править код] C :

 Class HumanFamily : public std::map <ExString, Human> {
public:
   static const Human NoHumanFound;
const Human Find (const ExStringamp; name ) const {
  HumanFamily::const_iterator it = find (name);
  if (it == this->end()) {
     return NoHumanFound;
}
return (it->second);
}
  

Класс, вызывающий вышеупомянутый метод:

 Object r = HumanFamily.begin()->Find (name);
if (r == HumanFamily.NoHumanFound) {
  return HumanFamily.NoHumanFound;

}

return r;
  

Комментарии:

1. этот фрагмент кода может быть допустимым синтаксисом C (не говорю, что он будет делать то, что вы хотите, но без вашего кода C и определений классов это невозможно сказать)

2. в нем говорится, что объект не был объявлен в этой области

3. Итак, продолжайте и опубликуйте свой код на C , чтобы мы могли вам помочь.

4. @dcinadr: GMan спрашивает, как выглядят ваши классы и в каком контексте вы их вызываете. В вашем вопросе недостаточно информации, чтобы дать осмысленный ответ. В зависимости от того, как написаны классы, то, что у вас есть в C #, может быть допустимым C (измените Human. NotFound с Human::NotFound, и я думаю, мы сможем заставить это работать).

5. Не наследуется от стандартных контейнеров. Они не предназначены для этого и приведут к боли.

Ответ №1:

В языке C нет понятия object, класса, который действует как базовый класс для всех классов. Имея это в виду и предполагая, что у вас есть человеческий класс, вам нужно было бы определить operator == для класса. Один из способов сделать это:

 class Human {
public:
    bool operator ==(Human constamp; ) const;
    /* ... */
};
  

а затем позже:

 bool are_they_the_same(Human constamp; human1, Human constamp; human2)
{
    return human1 == human2;
}
  

Ответ №2:

Код C # на самом деле сравнивает адреса — являются ли эти две ссылки одним и тем же объектом, а не имеют ли эти два объекта одинаковое значение.

Не следует перегружать operator== в C тем же значением. В C это означает проверку того, имеют ли два, возможно, разных объекта одинаковое значение. Например, a и b могут быть разными строками, обе из которых содержат «Hello world» и, следовательно, a==b будут истинными.

Ваш конкретный код

 Object r = HumanFamily.begin()->Find (name);
if (r == HumanFamily.NoHumanFound) {
  return HumanFamily.NoHumanFound;

}

return r;
  

скорее всего, это связано с разделением ( будет статический и r динамический Object типы), и их можно просто заменить на

 return HumanFamily.begin()->Find (name);
  

Комментарии:

1. Так что, возможно, он должен / мог бы также сравнить адреса тогда.

Ответ №3:

Это довольно ужасно. Вы не должны наследовать от стандартных классов (за исключением iostream s), потому что у них нет виртуальных деструкторов, особенно когда их можно просто заменить составом. Кроме того, std::map уже имеет NotFound значение- std::map<>::end(); . Кроме того, ваши функции не служат никакой цели, и мне кажется, что вы пытаетесь вернуть полиморфно, но на самом деле это не ссылка, это значение.

Вам нужно взять книгу по C и действительно понять ее, потому что этот код заставляет меня думать, что вам серьезно нужна помощь.

Черт возьми, вам просто нужно достать книгу о программировании в целом. Ту функцию использования, которую вы опубликовали, можно было бы просто заменить на return HumanFamily.begin()->Find(name); .

Комментарии:

1. На самом деле я не могу это вернуть. Приложение завершает работу, если в очереди ничего нет. Я пытаюсь работать с кодом, который мне дали… у меня нет большой гибкости.