2017-08-06 69 views
0

我有一個名爲Complex的類,其中有許多成員方法返回該Complex類的對象,還有許多將類Complex對象作爲參數的成員方法。使用指針或對象重載操作符

class Complex 
{ 
public: 
    Complex sampleFunc(Complex c) { ... } 
    Complex operator+(Complex c) { ... } 
}; 

這將是一個圖書館,所以其他用戶會使用我的課程。因爲,大多數用戶使用:

Complex *ptrObj = new Complex(); // declaration 1 

,而不是使用:

Complex obj;      // declaration 2 

我已經寫上面將與申報工作,2但不與聲明1.我可以改變原型sampleFunc的代碼()如下:

Complex* sampleFunc(Complex *c) { ... } 

但我不能改變有意義運營商+()函數來獲取增加了兩個對象(而不是錯誤地增加了兩個三分球)的效果。那麼,我應該公開哪些API - 適用於聲明1還是適用於聲明2,還是應該爲每個函數提供兩個版本?我相信傳遞函數的指針會更快,但是操作符重載會成爲一個問題。

+0

如果它們被動態分配,然後存儲在某個地方,然後通過引用訪問,那麼你的重載將正常工作。你不能在指針類型上重載運算符。 – xaxxon

+0

你班的實際意義是什麼?它的一個實例有多大? –

+0

我的班級有一個字符數組,其長度可以從幾個字符到數千個字符不等。沒有其他數據成員存在,但該類包含大量函數(大約60+) – user1637645

回答

1

正如您在評論中所述,您的Complex類基本上是一個可變長度的字符串,並且包含char*加上int

做的第一件事情,那麼,就是從做new Complex阻止這個類的用戶,因爲它是沒有效率。你正在做類中的動態內存分配,所以不需要在外面做(你只是增加了更多的指針間接尋址)。

你應該寫你的運營商在傳統的方式,也就是要接受引用,不是指針。用戶通常不需要處理指針,因爲你的類將動態內存抽象爲實現細節。

例如:

class Complex 
{ 
public: 
    // TODO: define constructors and assignment operator 

    Complex sampleFunc(Complex&); // could also return Complex& (*this) 
    Complex operator+(const Complex&) const; 

private: 
    std::unique_ptr<char[]> _data; 
    size_t _size; 
}; 
+0

此前,我有2個構造函數:Complex(Complex * c){...}和Complex(Complex&c){.... //複製構造函數...}。我現在應該刪除第一個(非複製構造函數)嗎? – user1637645

+0

你應該只有一個拷貝構造函數:'Complex(const Complex&)'。注意所有拷貝構造函數應該有的'const'。 –

3

首先,你會經常會更好由值避免通,並指定您的成員函數作爲接受參考

class Complex 
{ 
    public: 
    Complex sampleFunc(const Complex &c) { ... } 
    Complex operator+(const Complex &c) { ... } 
}; 

const指定函數將就調用者而言,不會在邏輯上改變c - 除了不會創建要傳遞的對象的副本之外,這通常與通過值傳遞的效果相同。

卸下const允許對象而改變。

這就是說,你可以通過值傳遞給任何你喜歡的功能,如果是有意義的一個對象的副本傳遞給函數,而不是一個參考。

其次,使用另一種語言的成見展示,並導致您關於C錯誤的結論++。具體來說,你的信念

這將是一個圖書館,所以其他用戶將使用我的課程。因爲,大多數用戶使用:

Complex *ptrObj = new Complex(); // declaration 1 

,而不是使用:

Complex obj;      // declaration 2 

是假的。大多數C++開發人員在給出這兩種選擇的情況下會默認使用第二種形式,因爲在很多情況下,第一種形式在C++中的做法很差 - 由於完成時需要delete ptrObj,爲了避免內存泄漏,以及忘記這麼做的可能性,特別是在非平凡的代碼中。

使用庫中的代碼不會改變這一點。作爲一個粗略的規則(並且作爲一個粗略的規則,有一些例外),如果你發現自己編寫了很多使用C++指針的代碼(除非你正在編寫標準庫的一個版本),那麼你的設計就會被破壞。