种机制
类机制
#include<iostream>
#include<iomanip>
using namespace std;
class date
{
int year,month,day;
public:
void set(int y,int m,int d);
void set(string& s);
bool isleapyear();
void print();
};
void date::set(int y,int m,int d)
{
year=y;month=m;day=d;
}
void date::set(string& s)
{
year=atoi(s.substr(0,4).c_str());
month=atoi(s.substr(5,2).c_str());
day=atoi(s.substr(8,2).c_str());
}
bool date::isleapyear()//代表isleapyear()的操作时不会改变对象的值,二对于set函数肯定是不行的。
{
return((year%4==0&&year%100!=0)||(year%400==0));
}
void date::print()
{
cout<<setfill('0');
cout<<setw(4)<<year<<'-'<<setw(2)<<month<<'-'<<setw(2)<<day<<'\n';
cout<<setfill(' ');
}
int main(int argc ,char* argv[])
{
date d,e;
d.set(2000,12,6);
e.set("1991-10-18");
e.print();
if(d.isleapyear())
d.print();
system("pause");
}
error C2664: “void date::set(std::string &)”: 不能将参数 1 从“const char [11]”转换为“std::string &”
感觉应该是不会错的,找不到错在哪里麻烦大家指导指导
------解决方案--------------------
e.set("1991-10-18");
---》
e.set(string("1991-10-18"));
------解决方案--------------------
void date::set(string const& s)
------解决方案--------------------
void date::set(string s)
------解决方案--------------------
去掉void date::set(string& s)函数参数的的引用,或者把参数的传入值修改为变量,而非常量
------解决方案--------------------
2种修改方法
1.void set(string s);不能引用常量,表达式等
2.void set(const string& s);一定要引用,则必须加const,使其进行一个隐式的转换,这和不用引用时的效果一样
------解决方案--------------------
关键还是要理解为什么会这样?这样记得更牢;
其实就是相当于:
string &s = "XXX";
const string &s = "XXX";
哪个对的问题,这样的话就比较明显了。把一个常量付给一个非const变量显然是不行的。
------解决方案--------------------
"1991-10-18" 是个const char[],
string是个类.
char[] 能赋给string对象是因为有个string(const char*)构造函数.
set(string& s) 创建形参的时候,
所做的是 string& rs = "1991-10-18"; 等价于 string& rs = string("1991-10-18");
问题在哪里呢?
在于, string("1991-10-18") 是一个临时变量, 临时变量不能做左值, 所以用应用常引用指向它.
#include<iostream>
#include<iomanip>
using namespace std;
class date
{
int year,month,day;
public:
void set(int y,int m,int d);
void set(string& s);
bool isleapyear();
void print();
};
void date::set(int y,int m,int d)
{
year=y;month=m;day=d;
}
void date::set(string& s)
{
year=atoi(s.substr(0,4).c_str());
month=atoi(s.substr(5,2).c_str());
day=atoi(s.substr(8,2).c_str());
}
bool date::isleapyear()//代表isleapyear()的操作时不会改变对象的值,二对于set函数肯定是不行的。
{
return((year%4==0&&year%100!=0)||(year%400==0));
}
void date::print()
{
cout<<setfill('0');
cout<<setw(4)<<year<<'-'<<setw(2)<<month<<'-'<<setw(2)<<day<<'\n';
cout<<setfill(' ');
}
int main(int argc ,char* argv[])
{
date d,e;
d.set(2000,12,6);
e.set("1991-10-18");
e.print();
if(d.isleapyear())
d.print();
system("pause");
}
error C2664: “void date::set(std::string &)”: 不能将参数 1 从“const char [11]”转换为“std::string &”
感觉应该是不会错的,找不到错在哪里麻烦大家指导指导
------解决方案--------------------
e.set("1991-10-18");
---》
e.set(string("1991-10-18"));
------解决方案--------------------
void date::set(string const& s)
------解决方案--------------------
void date::set(string s)
------解决方案--------------------
去掉void date::set(string& s)函数参数的的引用,或者把参数的传入值修改为变量,而非常量
------解决方案--------------------
2种修改方法
1.void set(string s);不能引用常量,表达式等
2.void set(const string& s);一定要引用,则必须加const,使其进行一个隐式的转换,这和不用引用时的效果一样
------解决方案--------------------
关键还是要理解为什么会这样?这样记得更牢;
其实就是相当于:
string &s = "XXX";
const string &s = "XXX";
哪个对的问题,这样的话就比较明显了。把一个常量付给一个非const变量显然是不行的。
------解决方案--------------------
"1991-10-18" 是个const char[],
string是个类.
char[] 能赋给string对象是因为有个string(const char*)构造函数.
set(string& s) 创建形参的时候,
所做的是 string& rs = "1991-10-18"; 等价于 string& rs = string("1991-10-18");
问题在哪里呢?
在于, string("1991-10-18") 是一个临时变量, 临时变量不能做左值, 所以用应用常引用指向它.