我在第30行遇到错误(const Date date2 = new Date(2012年12月31日);)
错误讯息是: 从'Date *'转换为非标量类型'const Date'请求
以下是我的源代码:
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 :(得分:6)
你需要这样做:
const Date date2(31, 12, 2012);
在您的代码中,const Date date2
是Date
而new Date(31, 12, 2012);
返回指向Date
的指针(偶然泄漏)。
答案 1 :(得分:1)
好吧,使用new
会返回一个指针,您尝试将其指定给非指针const变量。
答案 2 :(得分:1)
问题在于您的代码:
1.const日期date2 =新日期(2012年3月31日);
在这里,您为对象Date
动态分配内存。运算符new
将返回指针,以便您需要接收对象示例的指针类型
const Date *date2 = new Date(31, 12, 2012);
2.cout&lt;&lt; “月份是”&lt;&lt; date2.getMonth()&LT;&LT;结束;
如果按照第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;
}
答案 3 :(得分: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);
答案 4 :(得分:0)
const Date date2 = new Date(31, 12, 2012);
此行会导致错误,因为date2
的类型为Date
,但右侧的结果的类型为Date*
。这是因为new
的工作方式。
根据C ++ 11标准的第5.3.4 / 2段:
new-expression创建的实体具有动态存储持续时间(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);