使用重载的 >> 运算符调用 CPP 构造函数

Posted

技术标签:

【中文标题】使用重载的 >> 运算符调用 CPP 构造函数【英文标题】:Calling CPP Constructor with overloaded >> operator 【发布时间】:2015-12-17 15:56:57 【问题描述】:

我对 c++ 很陌生,我想知道以下是否可行:

认为你有

class Client 
public:
    Client(string firstname, string lastname);
// ...

您能否重载>> 运算符以使用您刚刚提供的输入生成一个新对象?

喜欢

istream& operator>> (istream& is, Client* client) 
    cout << "First Name: ";
    is >> client->firstName;
    cout << "Last Name: ";
    is >> client->lastName;
    return is;

?

使用重载的 >> 运算符根据用户输入创建对象的正确方法是什么?你会怎么做? 如果我想这样做,我将不得不写

Client* client;
cin >> client;

但此时,客户端已经创建...

谢谢

【问题讨论】:

你的例子没有意义。虽然你可以编写一个返回值的运算符,但你失去了链接能力;此时最好只写istream&amp;构造函数 为什么没有意义? 因为它也需要一个指向对象的指针,所以 IOW 并不能解决您的问题。 是的,但这是问题的一部分。我将如何用这个创建一个新对象?像 cin >> newClient;用用户输入填充构造函数 你需要先声明newClient,这才是重点。不能在 &gt;&gt; 表达式中引入新名称。 【参考方案1】:

你可以这样做(客户端指针需要通过引用传递,然后读取到临时变量并创建客户端):

istream& operator >> (istream& is, Client * &client) 
    string firstname, lastname;
    cout << "First Name: ";
    is >> firstname;
    cout << "Last Name: ";
    is >> lastname;
    client = new Client(firstname, lastname);
    return is;


Client* client;
cin >> client;
// use client
delete client;

但我一般不建议这样做。更清洁的方法是拥有

istream& operator >> (istream& is, Client &client) 
    cout << "First Name: ";
    is >> client.firstname;
    cout << "Last Name: ";
    is >> client.lastname;
    return is;


Client client;
cin >> client;
// use client
// client destroyed on scope exit

【讨论】:

是的,或者Client client(std::cin)。或Client client(Client::constructFromInputStream(std::cin)). 如果没有Client client;,第一个是否可以工作?然后:怎么样? cin &gt;&gt; client; 会在操作符内部创建吗? @user3787706:是的。但你需要一个Client* client_ptr

以上是关于使用重载的 >> 运算符调用 CPP 构造函数的主要内容,如果未能解决你的问题,请参考以下文章

输入输出运算符重载

运算符小括号重载

c_cpp 重载调用运算符C ++

在 C++ 中调用成员的重载 << 运算符

C++ 作业 - 使用动态数组重载 >> 运算符

关系运算符重载