2010-09-10 40 views
5

我正在執行一個二次表達式,其中y=ax^2 + bx + ca,b,c是常量,x是一個變量。這裏是我的課:在C++中編寫原型構造函數

class quadratic { 
public: 
double evaluate(const double x); 
void getCoefficients (double &A, double &B, double &C); 
void setCoefficients (const double A, const double B, const double C); 

private: 
double a; 
double b; 
double c; 
}; 

我爲班級創建兩個構造函數,使下面是合法

quadratic y1 = quadratic(1.0, -5.0, 7.0); 
quadratic y2 = quadratic(-3.0, -2.0, 10.0); 
quadratic y3; 

默認構造函數應設置爲零,而在第二個構造函數的參數說明係數的初始值。

這裏是我認爲我應該做的是:

quadratic() //default values 
{ 
double A, double B, double C = 0.0; 
} 

quadratic(double A, double B, double C) //initial values 
{ 
double A = double a; 
double B = double b; 
double C = double c; 
} 

但是我不完全瞭解如何設置此並希望任何大師在搞清楚了這一點幫助。

回答

20

你或許應該用建設者的初始化列表,而不是:

quadratic() : a(0), b(0), c(0) 
{ 
} 

quadratic(double A, double B, double C) : a(A), b(B), c(C) 
{ 
} 

上述用途的一部分C++語言來初始化成員稱爲初始化列表的變量。


你做了什麼與參數的構造:

double A = double a; 
double B = double b; 
double C = double c; 

首先將不能編譯,但即使你簡化你做了什麼:

double A = a; 
double B = b; 
double C = c; 

然後仍然不會編譯,因爲A,B和C已經定義。當你把一個類型名稱後跟一個像上面這樣的變量名時,它會嘗試創建一個新變量。

所以,如果我們再次簡化爲:

A = a; 
B = b; 
C = c; 

那麼這一次仍然是錯誤的,但至少它會編譯。這是錯誤的,因爲您將參數設置爲未初始化的類變量的值。

相反,你想:

a = A; 
b = B; 
c = C; 

你所做的構造函數不帶參數:

double A, double B, double C = 0.0; 

這不會編譯。在一行中聲明多個變量正確的語法如下:

double A = 0, B = 0, C = 0; 

但這仍然是不正確的,它會簡單地創建3個新的變量A,B和C,並將它們初始化爲0。你什麼真正想要的是設置你的成員變量a,b和c。

所以你想:

a = b = c = 0;

+0

哇這使得很多更有意義然後我有什麼,並且是更清潔和更小的代碼。非常感謝這一點。 – HollerTrain 2010-09-10 12:06:54

+4

+1優秀的幫助和整理申請人對申報的困惑。 – Elemental 2010-09-10 12:09:44

+0

@HollerTrain:我做了一個btw的小編輯,所以如果你把代碼複製出來就重新複製出來。 – 2010-09-10 12:10:11

1

使用初始化列表來初始化類成員變量。你寫的是作業。

此外,OP中的代碼分配給構造函數中定義的局部變量而不是類成員變量。我猜的用意是初始化類的成員變量

quadratic() : a(0.0), b(0.0), c(0.0) 
{ 
} 

quadratic(double A, double B, double C) : a(A), b(B), c(C) 
{ 
} 
2

使用成員初始化列表:

quadratic(): 
    a(0),b(0),c(0) 
{} 

quadratic(double a_,double b_,double c_): 
    a(a_),b(b_),c(c_) 
{} 
+0

啊完美感。在主函數中實現這個最好的方法是什麼? – HollerTrain 2010-09-10 12:04:30

4

這樣做的直接,最簡單的方法是:

class quadratic { 
public: 
    explicit quadratic(double A=0,double B=0,double C=0): a(A),b(B),c(C) { } 
    double evaluate(const double x); 
    void getCoefficients (double &A, double &B, double &C); 
    void setCoefficients (const double A, const double B, const double C); 

private: 
    double a; 
    double b; 
    double c; 
}; 

聲明不帶參數的第二個構造和分配所有值設置爲0,也可以接受,但使用更多的代碼,對我來說,構造函數中的默認值是可取的。

這是替代的解決方案,除了以下事實:在構造僅使用1或2個參數不再有效相同:

class quadratic { 
public: 
    quadratic(double A,double B,double C): a(A),b(B),c(C) { } 
    quadratic(): a(0), b(0), c(0) { } 
    double evaluate(const double x); 
    void getCoefficients (double &A, double &B, double &C); 
    void setCoefficients (const double A, const double B, const double C); 

private: 
    double a; 
    double b; 
    double c; 
}; 
+1

+1雖然正確,但它不是「爲這個類創建兩個構造函數以便下面是合法的」,你給出了一個構造函數並允許它以4種不同的方式被調用。 – 2010-09-10 12:08:53

+0

鑑於你說這可以通過4種方式調用,而不是兩種,我修改了代碼以包含明確的默認構造函數 – Elemental 2010-09-10 12:14:21

+0

您可能希望將'explicit'關鍵字添加到ctor聲明中以便防止它被用於雙向二次轉換。 – 2010-09-10 12:14:59