这是我的班级 -
class stuff
{
private:
char s_val = 'x';
char e_val = 'y';
public:
stuff() {;}
stuff(const string &s) {
this->s_val = s[0];
this->e_val = s[s.length() - 1];
}
stuff(const stuff &other) {
this->s_val = other.s_val ;
this->e_val = other.e_val ;
}
stuff& operator=(const stuff &other)
{
this->s_val = other.s_val;
this->e_val = other.e_val;
return *this;
}
stuff& operator=(const string &s)
{
*this = stuff(s);
return *this ;
}
stuff& operator=(const char *c)
{
string s(c);
*this = stuff(s);
return *this ;
}
friend ostream& operator<<(ostream &os, const stuff &s)
{
os << s.s_val << " " << s.e_val ;
return os ;
}
};
这是我的主要内容 -
stuff s1("abc");
cout << s1 << endl ;
stuff s2(s1);
cout << s2 << endl ;
stuff s3 = s2 ;
cout << s3 << endl ;
stuff s4; s4 = "def" ;
cout << s4 << endl ;
// stuff s5 = "def" ; // compiler does not like it
// cout << s5 << endl ;
所以当我说stuff s5 = "def"
时,编译器决定我尝试在string
和stuff
之间进行某种类型转换,并且它说 -
error: conversion from ‘const char [4]’ to non-scalar type ‘stuff’ requested
但我实际上要做的是通过说stuff s5("bcd")
来模仿语句stuff s5 = "bcd"
。
我如何实现这种编码结构?
答案 0 :(得分:5)
这不会编译,因为隐式构造函数采用^c[0-9]+$
而不是const std::string&
。 const char*
可转换为const char*
,但编译器只会进行一次隐式转换以尝试并完成构造函数。您可以通过添加一个构造函数来解决这个问题,该构造函数接受const std::string
并委托给字符串构造函数(需要C ++ 11):
const char*
答案 1 :(得分:3)
您需要转换构造函数const char *
。在C ++ 11或更高版本中,这可以委托给您现有的string
构造函数:
stuff(const char * s) : stuff(std::string(s)) {}
从历史上看,或者如果你想避免创建一个临时字符串,它可能最简单的
stuff(const char * s) {
this->s_val = s[0];
this->e_val = s[std::strlen(s)-1];
}
(按照你在构造函数体中的赋值约定而不是直接初始化。)
如果没有这个,就不允许从字符串文字进行隐式转换,因为它需要两次用户定义的转换(const char *
到std::string
到stuff
),但是隐式转换序列只能涉及一个。显式转换(如stuff s5("bcd");
)可以通过string
构造函数完成。
您还可以删除复制构造函数和复制赋值运算符:它们完全按照隐式生成的运算符执行。