使用重载的 >> 运算符调用 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&
构造函数
为什么没有意义?
因为它也需要一个指向对象的指针,所以 IOW 并不能解决您的问题。
是的,但这是问题的一部分。我将如何用这个创建一个新对象?像 cin >> newClient;用用户输入填充构造函数
你需要先声明newClient
,这才是重点。不能在 >>
表达式中引入新名称。
【参考方案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 >> client;
会在操作符内部创建吗?
@user3787706:是的。但你需要一个Client* client_ptr
。以上是关于使用重载的 >> 运算符调用 CPP 构造函数的主要内容,如果未能解决你的问题,请参考以下文章