2010-11-14 58 views
3

讓說我有一個基本的2D Vector類像給人一種功能的實現在C以上的名稱++

class vector2 
{ 
    int x, y; 
} 

這兩個值可以用來表示一個位置以及寬度和高度。 C++是否爲我提供了一個暗示函數,例如vector2::getXpos(),然後還定義了vector2::getWidth(),並讓它使用相同的實現。

我知道我可以使這兩個函數內聯,但編譯器可能決定不內聯這些函數。所以如果getWidth只叫getXpos你最終會有兩個函數調用。什麼,我會想用這個

更relistic例子是getLength()和企業風險管理... getSpan()(當你說40" 電視在這裏像一個屏幕的思維)

我會假設,這將是像一個特殊的函數定義一個簡單的例子......我發現this page但是這聽起來就像是一個C的功能...和黑客攻擊的一位得到工作。

編輯

我不是在問我的機制n線功能...我basicaly想做點什麼功能相同

class MyClass 
{ 
    void ActaullyDoStuff(); 
    public: 
    void foo(){ActaullyDoStuff();} 
    void bar(){ActuallyDoStuff();} 
} 

,但在那裏我可以只寫類似

class MyBetterClass 
{ 
    public: 
    void foo(){ /* BLOCK OF CODE */ } 
    void bar(){ /* DO WHAT EVER foo() DOES */ } 
} 

我想bar()要的只是做foo()使同另一種方式根據情況,功能代碼可以有不同的更合適的名稱。

+4

您確定要使用的位置以及尺寸相同的類型,只是因爲他們碰巧在結構上*相同嗎?聽起來對我來說是個壞主意。我會定義兩種不同的類型。這使得客戶端代碼的意圖更加清晰。 – fredoverflow 2010-11-14 15:09:08

+1

「我不是在問內嵌函數的機制......」,也許不是......但內聯函數做你想做的事情...... – ronag 2010-11-14 16:05:21

回答

1

看來你並沒有以面向對象的方式思考這個問題。我不得不第二個mjfgates的建議,你真的不想這樣做。

你想要做的是將矢量的概念抽象爲一個類,並實現你可能想用於矢量的常用方法。實際上,您可能需要考慮將上面的類示例作爲「Point」類實現,然後讓「Vector」類聚合兩個點類。

使用你的例子,如果你的類被用於兩個不同的目的,它將不會被很好地定義。假設你想在某個類上繪製一個方法來繪製vector2。你將不得不知道vector2的哪些實例代表一個起點,哪些代表一個寬度/高度。你可能還需要第三個表示來表示方向。更簡單的方法是使用getStartPoint,getEndPoint和其他方法來實現矢量,這些方法將對矢量進行適當的計算。然後消費者不需要知道vector2類的內部工作,他們只需調用方法來獲取他們需要的信息。

0

您引用的鏈接是AFAIK不是C功能,但是特定於該特定編譯器的內容。

C++提供了這樣一種機制:它恰好是內聯函數!擔心編譯器不能優化可用內聯函數中的冗餘調用是絕對不成熟的優化。內聯,然後衡量你是否擔心表現。

如果您絕對堅持要消除冗餘呼叫的機會,那麼您可以對預處理器#define進行一些操作,但請注意:宏不尊重類邊界,並且您的頭文件遲早會跺腳在其他一些不相關的代碼上。最好不要去那裏。

+0

不要忘記#define-inline'd是一種痛苦,調試! – mmmmmmmm 2010-11-14 15:43:29

+0

@rstevens:的確如此。我幾乎不能推薦它,但如果更復雜的方式實現你可以使用內聯函數更優雅地進行操作,這是一種可能。如果的確如此,你真的想添加**明顯的**複雜性(幾個成員函數名稱),而實際上它並不存在。 – 2010-11-15 11:49:06

2

但是編譯器可能會決定不 直列這些功能

那麼編譯器可能有一個很好的理由這樣做。

我認爲這是一個非問題,只是用替代名稱調用「真實」函數的功能,並且編譯器很可能將其內聯。

編輯:

如果沒有說服你,可以在Visual Studio中使用__forceinlineHere是強制內聯GCC的方式。

EDIT2:

class MyBetterClass 
{ 
    public: 
    void foo(){ /* BLOCK OF CODE */ } 
    __forceinline void bar(){ foo(); /* DO WHAT EVER foo() DOES */ } 
} 
-1

所以,你想有兩個功能,對同一個對象,返回完全相同的數據,爲相同的數據類型。

不要那樣做。

爲相同數據提供多條路徑是這樣的一種情況,聽起來像是對於誰將會使用您的對象而言可能是方便的 - 直到您思考它爲止。會發生什麼情況是,在六個月後,有人會在兩個函數中的一個函數中發現一個錯誤,並且您修復了該函數而不是另一個函數,所以錯誤仍然存​​在。或者正在爲你的對象編寫客戶端的程序員被誤解爲getLength()和getSpan()之間有什麼不同。

有一次我會這樣做時,將實現一個接口,需要重複現有的成員函數。在這種情況下,界面的功能將是虛擬的,因此內聯的概念將消失。

+4

除了我只想寫一次函數,並給它多個名字以後再調用它。所以如果'foo'有一個bug並且它是固定的,因爲'bar'是相同的函數,它也被修復了。 – thecoshman 2010-11-14 15:41:40

+0

錯誤地解釋了這個問題,並提供了非常規的建議。 – Syndog 2016-05-19 18:49:56

0

你可以使用預處理器#define s ....如果你陷入了世界上最糟糕的錯誤。如果你願意,你可以得到相當於內聯的保證,或者如果你想要的話,也可以是別名。

1

使用C++ 11你可以這樣做:

//works for non-template non-overloaded functions: 

const auto& new_fn_name = old_fn_name; 

其他的解決方案: How do I assign an alias to a function name in C++?

+0

應該將此工作作爲方法實現嗎?即new_fn_name實際上是'MyClass :: doStuff()'? – einpoklum 2016-02-12 08:50:19

相關問題