我在班上重载运算符'new'时遇到问题。
代码:
time.h中
#ifndef TIME_H_
#define TIME_H_
#include <cstddef>
#include <stdlib.h>
class Time {
private:
int hours;
int minutes;
public:
Time(int a = 0, int b = 0) : hours(a), minutes(b) {};
void AddMin(int m);
void AddHours(int h);
void Reset(int h = 0, int m = 0);
void Show() const;
Time Suma(const Time & t) const;
//przeladowania
void* operator new(size_t);
};
#endif
time.cpp
#include "time.h"
#include <iostream>
#include <cstddef>
#include <stdlib.h>
void Time::AddMin(int m)
{
this->minutes += m;
this->hours += this->minutes / 60;
this->minutes += this->minutes % 60;
}
void Time::AddHours(int h)
{
this->hours += h;
}
void Time::Reset(int h, int m)
{
this->hours = h;
this->minutes = m;
}
void Time::Show() const
{
std::cout << this->hours << " hours and " << this->minutes << " minutes" << std::endl;
}
////overloading
void* Time::operator new(size_t size)
{
void *storage = malloc(size);
if (NULL == storage) {
throw "allocation fail : no free memory";
}
std::cout << storage << std::endl;
Time * time = (Time*)storage;
time->minutes = 12;
return time;
}
prog.cpp
#include <iostream>
#include "time.h"
int main()
{
Time * timeNew = new Time();
timeNew->Show();
std::cout << timeNew << std::endl;
return 0;
}
结果 - addreses:
0104F5E8
0 hours and 0 minutes
0104F5E8
我不明白为什么我的对象在内存中有其他地址。我想如果我返回指针,那么我的对象timeNew(在prog.cpp中)应该与time.cpp中的存储具有相同的地址。
我知道它是一个函数,但是我使用了指针,因此在返回程序后它不应该删除。
为什么timeNew有0小时0分?我在功能上签名。
你能解释一下我做错了什么吗?
答案 0 :(得分:-1)
注意:正如StoryTeller在评论中指出的那样,在调用构造函数之前访问对象通常是一种非常糟糕的做法,并且可能容易出现危险的错误。它几乎从来没有必要。除非你故意实施肮脏的黑客攻击,否则你可能不会这样做。请记住,c ++中的new运算符与python中的新运算符完全不同,例如,它用于创建不可变类型。
为什么timeNew有0小时0分?我在新函数中指定了一个值。
这是因为在运算符new
之后,调用构造函数并且由于您没有传递参数,构造函数将在您分配{{1}后重置minute
和hours
的值转到12
。
如果您想在minutes
中查看此作业的效果,只需更改:
operator new
使用:
Time(int a = 0, int b = 0) : hours(a), minutes(b) {};