2012-03-06 35 views
0

我可以創建一個班級並從外部來源分配他的姓名嗎?定義指令的類名。可能?

例如:

// Something like this 
#define ClassName Clients 

class ClassName 
{ 
    public: 
    ClassName(); 
}; 

ClassName::ClassName() 
{ 
    // 
} 

編輯:我真正的代碼 (這樣一來,在DUNIT框架的XML輸出,我的測試名稱是測試名稱,而不是DatabaseTest)

#define TestName DatabaseTest 

namespace TestName 
{ 
    class TTest : public TTestCase 
    { 
     public: 
     __fastcall virtual TTest(System::String name) : TTestCase(name) 
     { 
     } 
     virtual void __fastcall SetUp(); 
     virtual void __fastcall TearDown(); 

     __published: 
     void __fastcall t1(); 
    }; 

    void __fastcall TTest::SetUp() 
    { 
    } 

    void __fastcall TTest::TearDown() 
    { 
    } 

    void __fastcall TTest::t1() 
    { 
     CheckEquals(1,0); 
    } 
} 

class TTestName : public TestName::TTest 
{ 

}; 

static void registerTests() 
{ 
    Testframework::RegisterTest(TTestName::Suite()); 
} 
+1

你應該在發佈前至少嘗試 - 將你這樣做了,你可能已經找到了自己的答案是肯定的 – stijn 2012-03-06 14:30:42

+5

是的,一般來說,你不應該。 – 2012-03-06 14:32:23

+0

其實沒有工作。用「ClassName」名稱編譯。 – Stew 2012-03-06 14:33:41

回答

1

雖然絕對不推薦,但它是可能的。 C(或C++)預處理器用指定的定義值替換它們的名稱,而不必關心它們的含義。畢竟,他們只是預處理器。

所以,說你有這個頭文件:

generic_class.h

class ClassName 
{ 
    public: 
    ClassName() 
    { 
     // 
    } 
}; 

你可以得到這個類的多個實例是這樣的:

#define ClassName Server 
#include "generic_class.h" 
#undef ClassName 

#define ClassName Clients 
#include "generic_class.h" 
#undef ClassName 

請注意,你不應該爲標題添加警衛。

這段代碼當然很糟糕。

+0

我會接受你的回答,很好的例子,但不適合我的情況。編譯,但我的日誌文件註冊「ClassName」=/ – Stew 2012-03-06 15:00:02

+0

你能告訴我你是如何記錄班級名稱和你在哪裏做的? – Shahbaz 2012-03-07 14:49:35

+0

我不知道,這是由DUnit框架自動完成的。 – Stew 2012-03-07 14:51:47

1

是。預處理在編譯之前進行。

你的編譯器將主要看

class Clients 
{ 
    public: 
    Clients(); 
}; 

Clients::Clients() 
{ 
    // 
} 

但是,爲什麼你要這樣?是否有一些潛在的問題要解決?我相信有更好的方法。

+0

我正在嘗試將我的單元測試用於padronize。我將用代碼示例更新我的帖子。 – Stew 2012-03-06 14:35:28