2013-05-10 7 views
1

У меня есть три указатели на три объекта:.C оператор ++ для а = Ь * с указателями на а, Ь, с-объектов в качестве входных данных

MyClass* a = new MyClass(...); 
MyClass* b = new MyClass(...); 
MyClass* c = new MyClass(...); 

Теперь я хочу, чтобы указать оператор в MyClass так, чтобы Я могу сделать:

a = b*c; 

Так, Ь, с уже существующими крупными объектами, которые я не хочу делать какие-либо дополнительные копии. Я хочу сделать умножение и напрямую написать результат «a».

1) Возможно ли это с операторами C++? 2) Может ли кто-нибудь дать мне несколько советов по синтаксису? (я немного новичок в операторах.)

Благодарен за любую помощь.

+0

См http://stackoverflow.com/questions/4421706/operator-overloading – Danstahr

+0

Синтаксис является правильным для типов объектов, но не для типов указателей. Для вашего конкретного случая попробуйте '(* a) = (* b) * (* c);'. Уродливая, но еще одна причина не использовать необработанные указатели :) Скобки не являются технически необходимыми, но делают их намного легче читать. – Chad

+3

Почему указатели? Почему не соответствующие объекты? –

ответ

1

Если вы написали operator* для MyClass.

MyClass* a = new MyClass(...); 
MyClass* b = new MyClass(...); 
MyClass* c = new MyClass(...); 

вы должны использовать его, как показано ниже:

*a = (*b) * (*c); 

И вы не можете сделать это для указателей. Например, это невозможно :

MyClass *operator*(const MyClass *a, const MyClass *b) // Impossible 
{ 
... 
} 

Поскольку определение оператор должен иметь аргумент MyClass.

+0

Просто пояснение «определение оператора должно иметь аргумент« MyClass »: в общем, перегруженные операторы должны иметь хотя бы один аргумент определенного пользователем типа. В этом случае единственным определяемым пользователем типом является 'MyClass', поэтому определение должно иметь аргумент' MyClass'. –

+0

Будет ли это уменьшать построение копии: '* a = * b; * a * = * c; '? –

+0

ОК спасибо вам, ребята. Я думаю, что могу сделать вывод, что невозможно сделать то, что я желаю, не передавая фактический объект (например, * b, * c). Для моих целей мне нужно будет получить доступ к фактическому указателю на буфер в 'a' (то есть LHS a = b * c), который, по-видимому, невозможен с использованием операторов. –

0

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

EDIT Как указано в комментариях, вы не можете этого сделать. По крайней мере, один из аргументов должен быть типа класса или ссылки на класс.

Если вы хотите избежать огромных операций копирования, вы должны использовать семантику перемещения C++ 11 или эмулировать их через что-то вроде MoveProxy или Boost.Move support-library.

Пример кода:

// loads of memory with deep-copy 
struct X { 
    int* mem; 

    X() : mem(new int[32]) { } 
    // deep-copy 
    X(const X& other) 
    : mem(new int[32]) { std::copy(other.mem, other.mem+32, this.mem); } 
    ~X() { delete[] mem; } 
    X& operator=(const X& other) { std::copy(other.mem, other.mem+32, this.mem); return *this; } 
    X(X&& other) : mem(other.mem) { other.mem = nullptr; } 
    X& operator=(X&& other) { delete[] mem; this.mem = other.mem; other.mem = nullptr; return this; } 

    friend void swap(const X& x, const X& y) 
    { std::swap(x.mem, y.mem); } 


    friend 
    X operator*(const X& x, const X& y) 
    { return X(); } 
}; 
+0

'operator * (MyClass *, MyClass *)' также является незаконным. «Операторная функция должна быть либо нестатической функцией-членом, либо быть не-членной функцией и иметь хотя бы один параметр, тип которого является классом, ссылкой на класс, перечисление или ссылку на перечисление». – aschepler

+0

@aschepler Спасибо, я этого не знал. – pmr

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