c++类转换的可能性

C++ class conversion possible?

本文关键字:可能性 转换 c++      更新时间:2023-10-16

我有以下代码:

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

这是因为caconst对象,不能调用非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; }