2012-12-18 71 views
1

我想知道是否有辦法我可以寫一個函數原型的.h文件,並在實現中改變簽名,所以它會與原型略有不同。C++原型不同然後實現

我想這樣做的原因是因爲有一些#include的枚舉類型,我不想在.h文件中做,但只在.c文件中,並且枚舉是函數的簽名,所以我想知道如果我可以寫枚舉作爲INT(枚舉和int基本上是相同的..)或原型中的東西,但然後我得到一個編譯錯誤。 有沒有一個很好的方式,我可以做它?

在此先感謝..

+0

是的,使用私有常量#defines而不是枚舉。 – cdleonard

+0

你是什麼意思? – gal

回答

6

如果我理解正確的話,你總是可以做一個包裝函數,例如。

file.h

void DoSomething(int i); 

file.cpp

void DoSomething(int i) 
{ 
    ActuallyDoSomething((MyEnum)i); 
} 

static void ActuallyDoSomething(MyEnum myEnum) 
{ 
    // Do something 
} 

在OOP程序的情況下,它可能看起來像以下:

file.h

class ISomething 
{ 
    virtual void DoSomething(int i) = 0; 
}; 

file.cpp

class Something : ISomething 
{ 
private: 
    void ActuallyDoSomething(MyEnum myEnum) 
    { 
     // ... 
    } 

public: 
    void DoSomething(int i) 
    { 
     ActuallyDoSomething((MyEnum)i); 
    } 
} 

編輯:在迴應評論:我建議提供了一個函數重載呢。

file.h

void DoSomething(int i); 
void DoSomething(MyEnum myEnum); 

file.cpp

void DoSomething(int i) 
{ 
    DoSomething((MyEnum)i); 
} 

void DoSomething(MyEnum myEnum) 
{ 
    // Do something 
} 

最後編輯:這個解決方案應該無需使用C++ 11的工作。

file.h

#pragma once 

enum MyEnum; 

void DoSomething(int i); 
void DoSomething(MyEnum enum); 

FileWithMyEnum.h

#pragma once 

enum MyEnum 
{ 
    One, 
    Two, 
    Three 
}; 

file.cpp

#include <file.h> 
#include "FileWithMyEnum.h" 

// Implementations 
+0

如果有人想知道性能影響,任何體面的編譯器都會使用-O2優化它。實際上,使用static關鍵字會更好,並且還有助於編譯器優化:-) – benjarobin

+1

'ActuallyDoSomething'應該標記爲'static'。 – Pubby

+0

是的,我想過,但我忘了提及,我仍然想用枚舉類型而不是INT來調用這個函數.. – gal

1

如果是C++,你可以使用函數重載,我猜。

file.h

void DoSomething(int i); 

file.cpp

void DoSomething(MyEnum myEnum) 
{ 
    // Do something 
} 

void DoSomething(int i) 
{ 
    DoSomething((MyEnum)i); 
} 

我沒有使用C++一會兒。所以,不是100%確定這是否會按預期工作。

+0

是啊,看起來不錯,但問題是,我仍然想用枚舉類型來調用這個函數,而不是用int .. – gal

+0

所以你希望原型應該用'int'&嚴格不用'enum',但是所有的調用都會使用'enum'? – anishsane

+0

是的,我希望調用將與枚舉完成,原型文件將不包括枚舉文件。 – gal

0

不是。在C++ 11中,你可以在頭文件中使用一個不透明的枚舉聲明,這樣就不必指定枚舉常量,但通常,enum足夠輕便,並且通常不會引入任何其他依賴項,所以在任何需要的地方都沒有真正的反對意見。

+1

是的,但是#include在枚舉旁邊包含更多的東西,所以我不想將它包含在.h文件中,但只包含在相關的.cpp文件中。 – gal

+0

@gal如果枚舉在命名空間範圍內,什麼是阻止你把它分解成它自己的頭文件? (如果它處於類的範圍內,則沒有太多可以做的事情;如果沒有定義類是可見的,則不能命名該枚舉。) –

+0

我無法更改枚舉的現有用法.. – gal

1

我將概述如何創建前向聲明標題。這種技術可能從<iosfwd>很熟悉,它從<iostreams>轉發宣告有用的東西。請注意,只有C++ 11允許您轉發聲明一個枚舉。

huge_header_with_e.h 
enum E { Zero, One, Two }; 

great_lib_fwd.h 
enum E; 
void f(E); 

great_lib.h 
#include "great_lib_fwd.h" 
#include <huge_header_with_e.h> 
void f(E e); 

great_lib.c++ 
#include "great_lib.h" 
void f(E e) { /* do something with e */ } 

other_client.h 
#include "great_lib_fwd.h" 
void other_client(E); 

other_client.c++ 
#include "other_client.h" 
#include "great_lib.h" 
void other_client(E e) { /* use e */ } 

注意,在非常有限的環境中像other_client.h,列入huge_header_with_e.h的仍然是可以避免的。在實踐中,我懷疑你會發現你的客戶端代碼經常需要指定特定的枚舉常量,並且無論如何都需要包含huge_header_with_e.h,所以相對較少的翻譯單元將避免依賴。