C++:通过引用将 std::vector<> 成员返回到临时对象
C++: return a std::vector<> member, by reference, to a temporary object
我有两个函数。
function1 调用function2,它返回对对象的引用,然后我用它来调用公共函数。
function1(function2).returned_object.mymethod();
这是一种相当笨拙的做事方式,但它有效。
现在我遇到了一个问题,我需要调用一个方法,然后调用另一个方法,所以我需要一个临时对象。
ClassName temp_obj = function1(function2);
temp_obj.method1();
temp_obj.method2();
我的问题是,如何声明一个临时对象来存储通过引用返回的对象。我猜我需要一个指针。
另一个问题是,temp_obj包含在向量中,我担心那里的冲突和内存泄漏。如果我使用指针,那么我是否也必须使用析构函数?
以下是相关代码:
bool Machine::perform_function(std::vector<Job>& jobs) {
bool add = true;
if (can_fail) {
add = coin_toss();
}
for (int i = 0; i < my_jobs.size(); i++) {
if (add) {
find_job(my_jobs[i], jobs).toggle(name, item_name, true);
}
if (!add) {
find_job(my_jobs[i], jobs).toggle(name, item_name, false);
}
}
return add;
}
Job& Machine::find_job(std::string jobname, std::vector<Job>& jobs) {
for (int i = 0; i < jobs.size(); i++) {
if (jobs[i].is_job(jobname)) {
return jobs[i];
}
}
}
您需要一个临时变量,但该临时变量可以作为引用,因此不会进行复制,并且可以安全地使用它。
但更好的是,您可以使用<algorithm>
函数来完成您需要的操作,而无需重新发明轮子:
std::string name = ...;
auto it = std::find_if(begin(jobs), end(jobs), [&name] (const Job& job) { return job.is_job(name); });
if (it != jobs.end())
{
it->method1();
it->method2();
}
结果存储为参考是完全可以的:
ClassName & temp_obj = function1(function2);
temp_obj.method1();
temp_obj.method2();
您的另一个问题:
另一个问题是,temp_obj包含在向量中,我担心那里的冲突和内存泄漏。
可以将jobs[i]
作为参考返回。 向量上的operator[]
返回引用本身。 如果您不以更改引用指向的内容的方式修改向量,并且您没有存储对已销毁对象的引用,则可以使用它。
当您的临时引用超出范围时,不会发生任何反应。 这只是一个参考。
假设返回引用的是function1()
(您的问题不清楚),只需使用引用
ClassName &temp_obj = function1(function2);
temp_obj.method1();
temp_obj.method2();
如果function1()
返回const
引用,则还需要temp
const
。
这样做的限制是,一旦创建,就不能重新拔插引用(用于引用其他对象)。 例如,在 ;
ClassName &temp_obj = function1(function2); // initialisation
temp_obj = function1(some_other_function); // reassignment
temp_obj.method1();
temp_obj.method2();
重新分配不会重新拔插temp
,即使function1()
在第二次调用时返回不同的引用。 相反,将被分配所引用的对象(假设它有一个工作赋值运算符)。 如果你想要一个变量,随着时间的推移可以引用不同的对象,你需要一个指针。
ClassName *temp_obj = &function1(function2); // assumes function1() returns a reference
temp_obj = &function1(some_other_function); // reassigns the pointer
temp_obj->method1();
temp_obj->method2();
你的问题不清楚。但是,如果要创建指向函数或成员函数的指针,则此处有关此类变量的常见问题解答。
https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 将Ref对象作为类成员
- 将包含C样式数组的对象初始化为成员变量(C++)
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 将公共但非静态的成员函数与ALGLIB集成
- 多成员Constexpr结构初始化
- 是否需要使用 - &gt;运算符在C 中调用成员函数时