2013-12-22 144 views
1

我是相當新的C++,並想知道這一點:C++創建一個對象,並在同一行中使用它

想我需要創建類X的對象x,並調用它的函數foo()它返回 一個Y類型的對象y。我在獲得y後不再需要x了。

目前,我做這樣的事情:(假設A和B是參數X的構造函數)

X x(a,b); 
Y y = x.foo(); 

然而,爲便於閱讀的問題,我想在一個單一的線做這些事情。另外,名字x也是沒有意義的。

我的本地編程語言是Java,在那裏我會做這樣的事情:

Y y = (new X(a,b)).foo(); 

我詢問這樣一個基本的問題道歉,但我的搜索提供什麼,因爲他們大多數返回關於C結果++內聯關鍵字,這與此事完全無關。

+0

這聽起來像你可能有一個設計問題:爲什麼你需要調用'foo'開始與?這可能是因爲'foo'是一個集體成員,它可以更好地作爲一個獨立的功能。 –

回答

1

C++默認使用堆棧分配。這意味着你不必使用新的,因爲變量不是指針。要解決您的問題,請僅刪除new

Y y = X(a, b).foo(); 

X(a , b)是的X一個構造函數的調用,並.foo()調用成員函數由構造函數返回的右值foo

請注意,C++變量生命週期鏈接到變量的作用域。這意味着一個變量在其聲明時被初始化,並在程序超出其範圍時被銷燬。
這意味着(在您的代碼中注意)由構造函數調用X(a , b)創建的右值的範圍僅爲該句子(Y y = X(a, b).foo();),因此該值在該句子結束後被銷燬。這就是爲什麼一般來說以這種方式調用ctors是不好的做法。

+0

謝謝,這對我很有用。我其實嘗試過這個,但是我的ide做了一點小問題。出於某種原因,它不會抱怨這次,而是之前做過。它現在編譯就好了:)我可能錯誤地放置了第一次的支架 – ddisk

+0

@DaanDisk看到了編輯,它可以幫助你理解C++變量。 – Manu343726

+0

那麼如果y仍然依賴於x,這會產生一個問題? (例如:如果y是通過x的迭代器) – ddisk

1

這將編譯例如:

#include <iostream> 

struct Person { 

    Person getRelatedPerson() { 
     return Person(); 
    } 

    void printAge() { 
     std::cout << 5 << std::endl; 
    } 
}; 

int main (int argc, char *argv[]) { 
    Person person; 

    person.getRelatedPerson().printAge(); 
    return 0; 
} 
+0

編譯,但可怕泄漏。 – chris

+0

你說得對。我糾正了它。 – ben

+0

它是級聯嗎? person.getRelatedPerson()。printAge(); – Taimour

相關問題