- Каков наиболее типичный / распространенный способ сделать это с объектом C ++ (без перегрузки оператора ==)?
- Это даже правильный подход? то есть. я должен не писать функции, которые принимают объект как аргумент, а писать функции-члены? (Но даже если так, пожалуйста, ответьте на оригинальный вопрос.)
Нет, ссылки не могут быть нулевыми (если только не определено поведение, в этом случае все ставки уже отменены). Нужно ли вам писать метод или не метод, зависит от других факторов.
- Между функцией, которая получает ссылку на объект, или функцией, которая принимает указатель в стиле C на объект, есть ли причины выбирать одну из них над другой?
Если вам нужно представить «нет объекта», передайте указатель на функцию, и пусть этот указатель будет NULL:
int silly_sum(int const* pa=0, int const* pb=0, int const* pc=0) {
/* Take up to three ints and return the sum of any supplied values.
Pass null pointers for "not supplied".
This is NOT an example of good code.
*/
if (!pa && (pb || pc)) return silly_sum(pb, pc);
if (!pb && pc) return silly_sum(pa, pc);
if (pc) return silly_sum(pa, pb) + *pc;
if (pa && pb) return *pa + *pb;
if (pa) return *pa;
if (pb) return *pb;
return 0;
}
int main() {
int a = 1, b = 2, c = 3;
cout << silly_sum(&a, &b, &c) << '\n';
cout << silly_sum(&a, &b) << '\n';
cout << silly_sum(&a) << '\n';
cout << silly_sum(0, &b, &c) << '\n';
cout << silly_sum(&a, 0, &c) << '\n';
cout << silly_sum(0, 0, &c) << '\n';
return 0;
}
Если «никакой объект» никогда не нужно представлять, то ссылки работают нормально. На самом деле, перегрузки операторов намного проще, потому что они принимают перегрузки.
Вы можете использовать что-то вроде boost :: необязательный.