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