gpt4 book ai didi

C++ - 通过传递对函数的引用来初始化变量?

转载 作者:行者123 更新时间:2023-11-30 00:39:10 25 4
gpt4 key购买 nike

是否可以从返回参数(通过 ref)初始化一个变量?假设我有类似的东西:

Car c;    // <- don't want to create a new Car here!
if (findCar("beetle", c)) {
...
}

如果 findCar 成功,它返回 true 并填充 c:

bool findCar(string name, Car& out) {
...
// return true if found
out = thecar;
return true;
}

现在,我的类 Car 没有一个 0 参数的构造函数,所以上面的代码无法编译。有没有办法在调用 findCar 之前保持 c 未初始化?

我想到的解决方案是:

  • 为 Car 添加一个廉价的 0 参数构造函数
  • 切换到指针(我宁愿避免)

最佳答案

有点。问题是引用绝对必须引用实际对象。因此,如果您通过引用返回,那么必须有人为返回的引用创建一个对象。因此,如果找不到匹配的对象,那么返回引用就没有真正的意义。如果传入引用,则必须先创建一个对象,供参数引用。

例如,您可以按以下方式解决此问题:

Car &findCar(const string &name) {
...
// return if found, else throw
if (found it) {
return thecar; // assuming `thecar` means some already-existing object,
// if it's a local variable then return by value!
} else {
throw std::runtime_error(name);
}
}

调用者做:

Car c = findCar("beetle");

Car &c = findCar("beetle"); 如果他们想“查看”找到的实际对象而不是它的拷贝。如果 findCar 希望调用者只看到一个拷贝,而不是某个内部对象,那么您当然可以按值而不是按引用返回 - 区别在于一个 &函数签名。

并且某个地方的某个人必须处理异常。

如果您希望避免异常,那么从 find 函数返回的正确对象是指针(或其他迭代器)。这是标准容器和算法在搜索时所做的,并且有一些特殊值(结束迭代器,或者您可以使用空指针)表示“未找到”。

关于C++ - 通过传递对函数的引用来初始化变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9149185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com