2015-09-22 56 views
-1

在C++中對代碼進行反向工程時,我發現代碼的一部分根本沒有得到。我是新來的C + +的方式是問這個問題可能不正確,因爲我不知道如何問這個具體的問題,請原諒我一樣。讓我詳細解釋一下。 我在代碼中遇到過這樣的事情。調用方法的對象依次調用C++中的另一個方法

obj.function_1().function_2(argument) 

,並在一些地方,我發現像

function_1().function_2(argument) 

function_1()function_2()是不同類的。任何人都可以幫助我解決這兩個問題。

+0

也許從函數返回一個不同的對象?你應該發佈相關的代碼 –

+1

閱讀'function_1'(或者至少它的聲明)並且注意返回類型。然後,找一本書或其他東西 - 提出有關你所看到的一切的問題是學習一種語言的一種不好的方式,而對每個人的使用都是一個很差的使用方式。 – Useless

回答

0

obj.function_1().function_2(argument)
- >調用objfunction_1(),然後調用function_2(argument)obj.function_1()

function_1().function_2(argument)
返回值 - >調用function_1()(全球或者在該代碼是類),那麼所有function_2(argument)對於返回值function_1()

1

obj.function_1()將返回一個對象,該對象具有一個成員函數function_2

這與function_1().function_2(argument)相同。

+0

或者,它可能會返回對非臨時成員對象的引用。 – Useless

+0

@無用,你是對的。編輯。 – Ralara

0
obj.function_1().function_2(argument) 

意味着obj具有function_1()function_1()返回類型(可能是一些類型的對象)具有function_2()這需要argument作爲參數。

同樣,

function_1().function_2(argument) 

意味着function_1()是有效在當前範圍內被調用,並且function_1()返回類型(可能是一些類型的對象)具有function_2()這需要argument作爲參數。

1

它只是調用function_2(argument)的返回值function_1()。 你也可以這樣寫

ObjA obja; 
ObjB objb = obja.function_1(); 
objb.function_2(argument); 

與你的第二個例子相同的工作:

ObjB objb = function_1(); 
objb.function_2(argument); 

這是寫在你的代碼不同,爲了不擔心這個臨時變量,可能是因爲它是以後不需要。

+0

除了您的示例按值複製以外,_may_(取決於返回類型)會顯着改變行爲。 – Useless

+0

在OP的例子中,我們立即丟棄臨時對象。假設'function_2(argument)'是'ObjB'的對象的setter。在OP的例子中,Imho新設定的值不能在任何地方使用。在我的例子中,可以使用改變的對象。當然,我認爲'ObjB(const ObjB&)'和'ObjB&operator =(const ObjB&)'是正確實現的。所以,我沒有得到那種重大的行爲改變。你能否詳細說明一下? – mistapink

+1

如果'function_1'返回對'obja'擁有的對象的引用,那麼您只是使用了該object_的_local副本,而不是'obja'的實例。所以,如果你突變了對象,你的改變就會消失。如果引用是多態對象的基本類型,那麼您另外對它進行了切片,如果'function_2'是虛擬的,則可能會調用與預期不同的過載。 – Useless

0

...任何人都可以請幫助我這上面兩行意味着什麼。

不是。這取決於對象和功能,並且您沒有顯示。沒有辦法告訴代碼是幹什麼的,除非你能看到所有的代碼

例如,所有的這些情況是不同的:

  1. 物鏡具有類型std::vector<int>function_1 == std::vector<int>::rbeginfunction_2 == std::vector<int>::reverse_iterator::operator[]

    在此,最後一行

    std::vector<int> obj = { 1, 2 }; 
    obj.rbegin().operator[](0); 
    

    給出了一個int&參照矢量的最後一個元素(並且不會改變任何東西)

  2. 物鏡具有類型std::vector<std::complex<double>>function_1 == std::vector<std::complex<double>>::frontfunction_2 == std::complex<double>::operator+=

    std::vector<std::complex<double>> obj = {{1,1}, {-1,-1}}; 
    obj.front().operator+=(-1); 
    

    從第一複合元件的實數部分中減去1,留下{0,1} = 作爲第一要素的代替{1,1} = 1 + I

  3. OBJ具有類型MyBigRDBMSfunction_1 == GetTables(返回爲在我們數據庫中的所有表的集合的代理),並function_2 == Drop

    obj.GetAllTables.Drop(); 
    

    下降從我們的數據庫中的所有表。