2013-05-27 38 views
0

我正在錯誤在線路30上限定常量(常量日期日期2 =新日期(31,12,2012);)C++中構造

錯誤信息是:從「日期*」到非標量 轉換類型 '常量日期' 要求

下面是我的源代碼:

class Date 
{ 
private : 
    int day ; 
    int month ; 
    int year ; 
public : 
    Date(){ 
     day = 1; 
     month = 1; 
     year = 2000; 
    } 
    Date(int d, int m, int y) : day(d), month(m), year(y){ 
    } 
    int getDay() const { return day ;} 
    int getMonth() const { return month ;} 
    int getYear() const { return year ;} 
}; 

int main() 
{ 
    const Date date ; 
    const Date date2 = new Date(31, 12, 2012); 

    cout <<"The month is "<< date.getMonth()<< endl ; 
    cout << " The month is "<<date2.getMonth()<< endl ; 
    return 0; 
} 
+0

'常量日期date2 =新日期(2012年3月12日);'在Java中工作,但不是C++。 – andre

回答

6

你需要這樣做:

const Date date2(31, 12, 2012); 

在您的代碼中,const Date date2Date,而new Date(31, 12, 2012);返回指向Date(順便泄漏)的指針。

1

那麼,使用new返回一個指針,你試圖分配給一個非指針const變量。

0

operator new返回一個指針,如果你真的需要一個指針,你應該使用

const Date* date2 = new Date(31,12,2012); 

代替。 而且別忘了delete date2

或者你也可以做兩種:

const Date date2(31,12,2012); 

const Date date2 = Date(31,12,2012); 
1

問題是在你的代碼:

1.const日期日期2 =新的日期(31,12 ,2012);所以,你需要採取指針類型的對象實例

const Date *date2 = new Date(31, 12, 2012);

2.cout < <「爲對象Date .Operator new

這裏要動態分配內存將返回指針這個月是「< < date2.getMonth()< < endl;

如果您修改代碼,每點1然後上面的一行,必須改變 所以,如果date2是指針,那麼你需要調用函數爲:

cout <<"The month is"<<date2->getMonth()<<endl ;

3。如果你想用你的代碼,那麼你只需從下面行刪除new

const Date date2 = Date(31, 12, 2012); 

您需要修改代碼:

int main() 
{ 
    const Date date ; 
    const Date *date2 = new Date(31, 12, 2012); 
    cout << " The month is " << date.getMonth() << endl ; 
    cout << " The month is " << date2->getMonth() << endl ; 
    return 0; 
} 

int main() 
{ 
    const Date date ; 
    const Date date2 = Date(31, 12, 2012); 
    cout << " The month is " << date.getMonth() << endl ; 
    cout << " The month is " << date2.getMonth() << endl ; 
    return 0; 
} 
0
const Date date2 = new Date(31, 12, 2012); 

此行導致錯誤,因爲date2的類型爲Date,但右側的結果的類型爲Date*。這是因爲new的工作方式。

每個段落的C++ 11標準的5.3.4/2:由一個新的表達式創建

實體有動態存儲的持續時間(3.7.4)。 [ - ]如果實體是非數組對象,則new-expression會返回一個指向創建的對象的指針。如果它是一個數組,new-expression會返回一個指向數組初始元素的指針。

因此,現在我們知道new爲堆上的操作數分配內存並返回一個堆棧分配的指針。你可能有一個誤解,認爲new創建一個對象(就像在Java,JavaScript或C#中),但在C++中並不是這樣。對於上面的線工作,你將不得不作出date2指針:

const Date *date2 = new Date(31, 12, 2012); 

但是,創建對象的正常方式是簡單地做以下(在你的情況下):

const Date date2(31, 12, 2012);