0

У меня есть две функции.C++: возвращает элемент std :: vector <>, по ссылке, во временный объект

function1 вызывает функцию2, которая возвращает ссылку на объект, которую затем я использую для вызова публичной функции.

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]; 

     } 
    } 
} 
+0

«Как я могу объявить временный объект, который будет хранить функцию, возвращаемую по ссылке» - вы не можете сохранить функцию в объекте. – immibis

ответ

1

Это прекрасно, чтобы сохранить результат в виде ссылки:

ClassName & temp_obj = function1(function2); 
temp_obj.method1(); 
temp_obj.method2(); 

Ваш другой вопрос здесь:

Другая проблема , temp_obj содержится в векторе, и меня беспокоят конфликты и утечка памяти.

Вполне можно вернуть jobs[i] в качестве ссылки. operator[] на векторе возвращает ссылку. Если вы не изменяете вектор таким образом, чтобы изменить то, на что ссылается эта ссылка, и вы не храните ссылку на объект, который был уничтожен, вы будете в порядке, чтобы использовать его.

Когда ваша временная ссылка выходит из сферы действия, ничего не происходит. Это просто ссылка.

+0

Что происходит, когда ссылка выходит за рамки? – bigcodeszzer

+0

@bigcodeszzer: ничего, ссылка не принадлежит объекту и не может вызвать утечку, это просто псевдоним для существующего объекта. – Jack

+0

справедливо .... – bigcodeszzer

2

Вам нужна временная переменная, но эта временная переменная может быть ссылкой, поэтому копия не будет выполнена, и вы можете ее использовать.

Но еще лучше, вы можете использовать функции <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(); 
} 
1

Предполагая, что 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();