2017-01-14 38 views
0

我需要操作符賦值方面的幫助。這是代碼:運算符= C++中的過載

Sinusoid.h:

class Sinusoid : public Component 
{ 
    float fs, f, A, fi; 
    int N; 
    double *array; 

public: 
    Sinusoid(float fs, float f, float Ts, float fi, float A); 
    void count(int type=1); 
    void clear(); 
    ~Sinusoid(); 
    double *getArray() { return this->array; } 
    double*& operator=(Sinusoid* const &rhs) { 
     return rhs->array; 
    }; 
}; 

main.cpp中:

#include "headers.h" 
int main() 
{ 
    int N = 1000 * 2.5; 
    Sinusoid *sinus = new Sinusoid(1000, 15, 2.5, (M_PI/4), 0.7); 
    double **answers = new double*[7]; 
    for (int i = 0; i < 7; i++) { 
     answers[i] = new double[N]; 
    } 
    //lab1 
    //Zad1 
    sinus->count(1); 
    answers[0] = sinus; 
    return 0; 
    } 

當我建立這個代碼中,我得到了以下問題:

C2440'=':無法從'Sinusoid *'轉換爲'double *'main.cpp:15

我知道我可以分配重載操作符「=」但我想要一個類的私人成員(雙*數組;);我知道我可以通過「getArray()」方法做到這一點,但我想學習更多「美麗」的做法。希望你能幫助我。

謝謝。

+0

*答案[0] =竇? –

+0

是的,我知道我不能使用正弦 - >數組,因爲它是類的私有成員 - 我想使用重載的操作符「=」將此分配給答案變量 – Robert

+0

即使我做*答案[0]它是還是一樣。 – Robert

回答

1

您的double*& operator=(Sinusoid* const &rhs)運營商不會做你顯然認爲它做的事情。

operator=成員函數允許您在右側有一個賦值左側的類(Sinusoid)和參數類型的實例(Sinusoid*)的實例。所以你寫的會讓你這樣做:

Sinusoid* pointer = whatever; 
Sinusoid object; 
object = pointer; 

很明顯,這不是你想要的。 (可能不是您想要的東西。)

operator=的返回類型對此基本用法沒有任何影響。這意味着object = pointer的結果是double*&。所以它會讓你寫:

double* foo; 
foo = (object = pointer); 

而這對你想要的東西沒有幫助。

由於answers[0]是一個指針,因此無法爲其創建自定義賦值運算符。然而這種語言有不同的機制可以在這裏使用。您可以爲您的類創建隱式轉換運算符,以便編譯器在合理時允許將其轉換/衰減爲不同的類型。嘗試添加以下內容到您的班級:

operator double*() { 
    return rhs->array; 
} 

這應該適用於您想要的情況。

雖然我個人認爲沒有任何問題,但首先需要致電getArray()。有時,明確的函數調用的清晰度可以使得更容易閱讀實際正在發生的事情。

1

的Try ...

class Sinusoid : public Component { 
... 
    operator double*() { 
     return array; 
    } 

和使用

answers[0] = *sinus; 
+0

非常感謝! :) – Robert