#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. На самом деле я не могу это вернуть. Приложение завершает работу, если в очереди ничего нет. Я пытаюсь работать с кодом, который мне дали… у меня нет большой гибкости.