2011-09-30 57 views
2

我認爲這是一個非常新的問題,但我從來沒有找到答案。我不知道該如何描述這個問題,但是我經常發現,我必須根據當前層次結構訪問與當前對象「遙遠」的對象。我只是想確保這是做到這一點的正確方法。C++訪問遠離當前類層次結構的對象

這同時也從main傳入參數。我發現遠離主體的一些對象需要多次傳入一個參數。遠離主體的對象如何從命令行獲取信息?

例如,對於第一種情況,對於4班...

class A{ 
    B b; 
    //need to check status of D 

    //choice 1 
    b.get_c().get_d().get_status(); 

    //choice 2 
    const C& c = b.get_c(); 
    const D& d = c.get_d(); 
    d.get_status(); 
}; 

class B{ 
public: 
    C c; 
    const C& get_c() {return c;} 
}; 

class C{ 
public: 
    D d; 
    const D& get_d() {return d;} 
}; 

class D{ 
public: 
    bool check_status(); 
}; 

說類似,A是汽車,B是門組件,C是門,d是鎖。然後A必須檢查說,是鎖定的,否則阻止啓動。選擇3是直接從A調用D的方法,我必須在C,B和A中創建幾層check_status()並返回D,C,B.check_status()。

不要所有這些調用子對象(如果代碼有點複雜)會得到很多開銷嗎?

謝謝。

回答

1

這類問題的答案總是相同的:除非和成爲問題之前不要擔心,然後再進行測量以確定哪個選項最合適。是的,調用子對象有一個開銷,但是用你給出的例子(以及許多現實生活中的例子),這種開銷是不可避免的(無論如何,編譯器可能會優化它的一部分)。

1

所有這些函數都是內聯的,因爲它們是在類定義中聲明的,並且很簡單return something;。他們返回引用,因此沒有涉及副本(請注意,它們應該可能是const成員函數,否則我不會看到代碼將如何編譯)。應該沒有任何開銷,我會建議你編譯你的代碼,並看看生成的程序集,以確保。

0

嗯,symmety您可以在一個地方const B& get_b() const

get_b().get_c().get_d().get_status(); 

兩個choiches是完全等同的(和編譯器優化實際上可能產生相同的代碼)。

唯一的建議是宣佈獲取者爲const X& get_x() const,因爲他們不修改所有者。

0

除了上面的答案掌握Large Scale C++ Software Design的副本可能有助於這方面。不要擔心,現在第一章有點不相關,所提出的大多數想法仍然適用。

0

關於像你這樣的鏈式函數調用的性能,現在沒有太多需要擔心函數何時返回簡單的const引用。

但是,作爲一個可能的設計缺陷,您通常應該使用直接對象並避免深入挖掘其他對象的數據。形象地說,當你想知道什麼時候你的商家有一個產品可用,你直接問他(time = merchant.Availability(product);),不要問他的供應到達日期(time = merchant. GetSupplyerForProduct(product). SupplySchedule(). NextArrival();