c++类转换的可能性
C++ class conversion possible?
我有以下代码:
class B {
public:
B(const std::string& str):m_str(str) { }
B(const B& b):m_str(b.m_str) { }
B& operator=(const B& b) { m_str = b.m_str; return *this; }
private:
std::string m_str;
};
main()
{
std::string a = "abc";
B b(a);
}
类B属于客户机。我无法更改它,甚至可能不知道它的具体名称("B"只是一个例子);我只知道有一个客户端类接受std::string作为它的构造函数。现在我想把main()中的"a"的类型从std::string改为a,定义如下:
class A {
public:
A(const std::string& str):m_str(str) { }
A(const char *str):m_str(str) { }
A(const A& a):m_str(a.m_str) { }
A& operator=(const A& a) { m_str = a.m_str; return *this; }
private:
std::string m_str;
};
现在我有了一个新的main():
main()
{
A a = "abc";
B b(a);
}
这不能正常编译。在不改变新的main()的情况下,我能做些什么吗?我不能改变类B,类A也不应该以任何方式引用类B。谢谢!
添加强制转换操作符
class A {
public:
....
operator const std::string()
{
return m_str;
}
添加自定义转换函数为:
class A
{
public:
//other code
operator std::string()
{
return m_str;
}
//...
};
你可以这样写:
B b(a); //which is what you want
std::string s = a; //this is also okay;
void f(std::string s) {}
f(a); //a converts into std::string, by calling user-defined conversion function
但是你不能这样写:
const A ca("hi");
std::string s = ca; //error
这是因为ca
是const
对象,不能调用非const用户定义的转换函数。
注意用户定义的转换函数按值返回字符串,这意味着它返回原始字符串的副本。因此,您可以通过将其定义为:
来避免这种情况。operator const std::string &() const
{
return m_str;
}
现在你可以这样写:
const A ca("hi");
std::string s = ca; //ok
A a("hi");
std::string s = a; //ok
int main() //note the correct declaration of main
{
A a = "abc";
B b(a.GetString()); //GetString returns m_str;
}
顺便说一下,你所有的复制构造函数和复制赋值操作符的定义都与编译器为你自动生成的定义一致。
编辑
我刚刚注意到你的约束,main()
不应该改变。在这种情况下,您可以定义从a到字符串的转换函数(但注意,这可能很危险)。
class A
{
...
operator std::string() const {return m_str; }
};
添加到A类:
operator std::string () { return m_str; }
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 努力将整数转换为链表。不知道我在这里做错了什么
- HEX值到wchar_t字符(UTF-8)的转换
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将 Qvector<uint8_t> 转换为 QString
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中使用nlohmann从类到json的转换
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 如何使用OpenCV将RBG图像转换为HSV,并将H、S和V值保存为C++中的3个独立图像
- 复制列表初始化的隐式转换的等级是多少
- 正在将指针转换为范围
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 是否可以从int转换为enum类类型
- 从字符串到双精度的转换 - 可能性和错误
- c++类转换的可能性