0

我有兩個函數。C++:通過引用將一個std :: vector <>成員返回給一個臨時對象

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

     } 
    } 
} 
+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(); 
相關問題