2016-02-13 86 views
1

我不理解下面的「編程原理和實踐」第二版的代碼片段。通過Bjarne Stroustroup文章13.3。C++中的方法鏈接?

void Lines::draw_lines() const 
{ 
    if (color().visibility()) 
    for (int i=1; i<number_of_points(); i+=2) 
     fl_line(point(i–1).x,point(i–1).y,point(i).x,point(i).y); 
} 

我不明白顏色()。visibility()部分。這究竟是什麼?雖然我沒有完全理解這一點,但我聽說過方法鏈接。這是這種方法鏈的一個例子嗎?我在維基百科上看到,在一個鏈式方法中,第一個函數應該返回一個對象,而第二個函數通過第一個函數變成返回對象的成員函數。但是,在這個例子中,Bjarne Stroustroup在color()函數之前沒有實例。這個color()如何成爲一個對象的成員函數,因爲沒有實例可以工作?有人可以啓發這個請嗎?

+0

有一個實例。調用'draw_lines()'方法的方法。 – fanton

+0

'在一個鏈式方法中,第一個函數應該返回一個對象'_reference_到一個對象,而是。 – dxiv

+0

@dxiv:不一定。 'auto obj = createObject()。makeObjectRed()。makeObjectGreat()' - 所有這些都可以按值返回,而第一個可能是_must_。 –

回答

3

有顏色()函數

不要緊,之前沒有實例。 color()可能是Lines(具有實例this)的成員函數,或全局免費函數(根本沒有實例)。

然後如您所說,第二個函數visibility()應該是由第一個函數color()返回的對象的成員函數。

1

這是這種方法鏈的一個例子嗎?

通常情況下,方法鏈接描述了對成員函數的鏈接調用,它會返回調用它們的實例(通過引用)。但在這種情況下,第一個函數似乎不是它返回的實例的成員函數。否則,該模式與方法鏈接相同。

但是,在這個例子中,由Bjarne Stroustroup在color()函數之前沒有實例。

並由此可以推斷,color可以是一個非成員函數,或一個Lines構件在這種情況下,例如是隱式this。您還可以推斷它將實例返回給具有成員函數visibility的對象。當然,如果您有color的聲明可用,則無需進行此類扣除。

這個color()如何成爲一個對象的成員函數,因爲沒有實例可以工作?

它不是成爲成員函數。如果它是Lines的成員函數,那麼它在this上工作,否則它是一個自由函數並且不需要實例。在任何一種情況下,它都可以返回一個與名稱爲visibility具有成員函數的某種類型的無關實例。