C++:通过引用将 std::vector<> 成员返回到临时对象

C++: return a std::vector<> member, by reference, to a temporary object

本文关键字:gt 成员 返回 临时对象 lt vector 引用 std C++      更新时间:2023-10-16

我有两个函数。

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