2013-05-10 52 views
1

我有三個指向三個對象:C++操作者要= B * C與指針的a,b,和c對象作爲輸入

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

現在我想指定MyClass的操作員,使得我可以這樣做:

a = b*c; 

所以a,b和c是已經存在的大對象,我不想做任何額外的副本。我想做乘法運算並直接寫出結果'a'。

1)這是甚至有可能與c + +運營商? 2)有人可以給我一些提示語法? (我對運營商有點新鮮......)

感謝您的任何幫助。

+0

參見http://stackoverflow.com/questions/4421706/operator-overloading – Danstahr 2013-05-10 14:41:59

+0

的語法對象類型是正確的,但不能用於指針類型。爲你的具體情況嘗試'(* a)=(* b)*(* c);'。醜陋的,但不使用原始指針的另一個原因:)括號在技術上不是必要的,但使其更容易閱讀。 – Chad 2013-05-10 14:42:03

+3

爲什麼指針?爲什麼不適當的對象? – 2013-05-10 14:42:35

回答

1

如果您爲MyClass寫了operator*

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」參數。 – 2013-05-10 15:04:34

+0

這會減少複製結構:'* a = * b; * a * = * c;'? – 2013-05-10 15:26:23

+0

好的,謝謝你們。我想我可以得出結論,不可能在不傳遞實際對象的情況下做我想做的事情(例如* b,* c)。爲了我的目的,我需要訪問'a'中的緩衝區的實際指針(即a = b * c的LHS),這似乎不可能使用運算符。 – 2013-05-10 21:46:18

0

你真的不想這樣做。堅持使用定義運算符的標準方法來定義值而不是指向值的指針會使所有事情變得更加清潔和易於維護。

編輯正如在評論中指出的,你甚至不能這樣做。至少有一個參數必須是類類型或對類的引用。

如果您想要避免巨大的複製操作,您應該使用C++ 11移動語義或通過類似MoveProxyBoost.Move支持庫的方式來模擬它們。

示例代碼:

// 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 2013-05-10 14:53:31

+0

@aschepler謝謝,我不知道。 – pmr 2013-05-10 15:01:44

相關問題