0

我在第 30 行遇到错误 (const Date date2 = new Date(31, 12, 2012);)

错误消息是:请求从“日期*”转换为非标量类型“常量日期”

下面是我的源代码:

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;
}
4

5 回答 5

6

你需要这样做:

const Date date2(31, 12, 2012);

在您的代码中,const Date date2is a Datewhilenew Date(31, 12, 2012);返回指向 a 的指针Date(顺便说一句,它会泄漏)。

于 2013-05-27T14:10:56.887 回答
1

好吧, usingnew返回一个您尝试分配给非指针 const 变量的指针。

于 2013-05-27T14:11:09.800 回答
1

问题出在您的代码中:

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

在这里,您正在为 object 动态分配内存Date。Operatornew将返回指针,因此您需要考虑 object 示例的指针类型

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

2.cout << " 月份是 " << 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;
}
于 2013-05-27T14:42:06.480 回答
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);
于 2013-05-27T14:14:55.227 回答
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 表达式返回一个指向所创建对象的指针。如果它是一个数组,则 new 表达式返回一个指向数组初始元素的指针。

所以现在我们知道new它在堆上为其操作数分配内存并返回一个堆栈分配的指针。您可能对new创建对象有误解(如在 Java、JavaScript 或 C# 中),但在 C++ 中并非如此。要使上述行起作用,您必须创建date2一个指针:

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

但是,创建对象的正常方法是简单地执行以下操作(在您的情况下):

const Date date2(31, 12, 2012);
于 2013-05-27T14:45:06.973 回答