Имя класса по директиве define. Возможный? - PullRequest
0 голосов
/ 06 марта 2012

Могу ли я создать класс и присвоить его имя из внешнего источника?

например:

// Something like this
#define ClassName Clients

class ClassName
{
    public:
    ClassName();
};

ClassName::ClassName()
{
    //
}

Редактировать: мой реальный код (Таким образом, в выводе XML платформы DUnit мое имя теста - TestName, а не 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());
}

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Хотя это абсолютно не рекомендуется, это возможно.Препроцессоры C (или C ++) заменяют любое имя на указанное определенное значение, не заботясь об их значении.В конце концов, они просто препроцессоры.

Итак, скажем, у вас есть этот заголовочный файл:

generic_class.h

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

Вы можете получить несколько экземпляров этого класса, напримерthis:

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

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

Обратите внимание, что вы не должны добавлять охрану в заголовок.

Этот код, конечно, ужасен.

1 голос
/ 06 марта 2012

Да.Предварительная обработка выполняется перед компиляцией.

Ваш компилятор в основном увидит

class Clients
{
    public:
    Clients();
};

Clients::Clients()
{
    //
}

Но зачем вам это?Есть ли какая-то основная проблема, которую вы пытаетесь решить?Я уверен, что есть лучшие способы.

...