2010-05-06 11 views
2

我將'.cpp'文件的擴展SVN關鍵字文字存儲在'static char const * const'類成員中,並且希望儘可能相似地存儲.h說明。簡而言之,我需要保證一個靜態成員(大概是一個.cpp文件)的一個實例化到一個生成在一個可能共享的.h文件中的自動生成的非整數文字。不幸的是,該語言不會嘗試解析由在類定義之外作出的賦值而產生的多個實例化,並且明確禁止在類定義中使用非整數的inits。我最好的嘗試(使用靜態包裝內部類)並不太髒,但我真的想做得更好。有沒有人有辦法模仿下面的包裝或有一個完全優越的方法?靜態類成員的定義初始化的最佳替代方法? (用於SVN關鍵字)

// Foo.h: class with .h/.cpp SVN info stored and logged statically 
class Foo { 
    static Logger  const verLog; 
    struct hInfoWrap; 
public: 
    static hInfoWrap const hInfo; 
    static char const *const cInfo; 
}; 

// Would like to eliminate this per-class boilerplate. 
struct Foo::hInfoWrap { 
    hInfoWrapper() : text("$Id$") { } 
    char const *const text; 
}; 

...

// Foo.cpp: static inits called here 
Foo::hInfoWrap const Foo::hInfo; 
char const  *const Foo::cInfo = "$Id$"; 
Logger   const Foo::verLog(Foo::cInfo, Foo::hInfo.text); 

...

// Helper.h: output on construction, with no subsequent activity or stored fields 
class Logger { 
    Logger(char const *info1, char const *info2) { 
    cout << info0 << endl << info1 << endl; 
    } 
}; 

是否有辦法來解決靜態鏈接地址發行了模板化的字符串文字的hInfoWrap類?分配給外部類定義的外部字符指針在語言上是有效的,但是與直接成員初始化基本上以相同的方式失敗。我明白了語言爲什麼會推卸整個解決方案問題,但是如果提供了一個反向extern成員限定符,它會非常方便,其中定義代碼在類定義中對任何調用者都是可見的,但僅在單個特殊點處實際調用在別處宣佈

無論如何,我離題了。什麼是我們擁有的語言,模板或其他方式的最佳解決方案?謝謝!

回答

1

大概,用一個靜態函數?

// Foo.h: 
class Foo { 
    static Logger  const verLog; 
    static char const*const getHInfo() { return "$Id$"; } 
public: 
    static char const *const cInfo; 
}; 

// Foo.cpp: static inits called here 
char const  *const Foo::cInfo = "$Id$"; 
Logger   const Foo::verLog(Foo::cInfo, Foo::getHInfo()); 
+0

我完全忘記了類內定義的靜態方法定義是合法的。這是我最終會使用的。謝謝! – Jeff 2010-05-07 18:05:24

0

也許你可以用宏做點什麼。

// Foo.h 
#define FOO_HINFO "$Id$" 

...

// Foo.cpp 
char const  *const Foo::hInfo = FOO_HINFO; 

我通常會避免宏,但在這種情況下,它可能是最乾淨的解決方案。

+0

因爲我試圖找到我的同齡人會想使用,以及一個解決方案,我可能會選擇這種簡單的方法,而不是任何的「素淨」的包裝方法,如果不是Alsk讓我實現我的更大的監督。儘管非常感謝您的迴應! – Jeff 2010-05-07 18:19:01