繁体   English   中英

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();

即使function1()在第二个调用中返回了不同的引用,重分配也不会重设temp 相反,将对要引用的对象进行分配(假设它具有有效的分配运算符)。 如果您想要一个可以随时间引用不同对象的变量,则需要一个指针。

 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM