Есть ли особый способ объявить/определить конструкторы (и деструкторы) C++

РЕДАКТИРОВАТЬ: Это обсуждение наилучшей практики в (упрощенном) случае, представленном ниже. Какой бы инструмент, стиль кодирования или что-то еще вы ни хотели предложить, опубликуйте это. Спасибо.

Почему нет специальных способов объявить или определить ctors/dtors без дублирования имени класса? Это раздражает, особенно при прототипировании и частом изменении имени класса.

Я имею в виду что-то вроде typedef:

struct SomeClassThatDoesSomething {
    typedef SomeClassThatDoesSomething ThisClass;
    ThisClass() { PrepareToDie(); }
    ThisClass(int a) : _a(a) { PrepareToDie(); }
    ThisClass(float a, int b) : _b(a), _a(b) { PrepareToDie(); }
    ThisClass(float a, char * b) : _b(a), _c(b) { PrepareToDie(); }
    ThisClass(char * a, int b) : _c(a), _a(b) { PrepareToDie(); }
    ThisClass(ThisClass &rhs) {  }
    ~ThisClass() {}
    void Burn() {}
    void PrepareToDie() {}
    int _a;
    float _b;
    char *_c;
};

struct SomeDerivedClassThatDoesSomething : public SomeClassThatDoesSomething {
    typedef ThisClass BaseClass;
    typedef SomeDerivedClassThatDoesSomething ThisClass;
    ThisClass(BaseClass &is_not_amused) : BaseClass(is_not_amused) { BaseClass::_a = 1; PrepareToDie(); }
    ThisClass(float a, char * b) : BaseClass(b, a) {}
    ~ThisClass() { BaseClass::Burn(); }
    unsigned int _a; // Different semantics up the tree.
};

//EDIT: Consider this: Enforce export name decoration policy.
#define DLL_API __declspec(dllexport) 
// ... or dllimport - not the point here
#define def_export_struct( name ) struct C##name; typedef C##name *P##name; struct DLL_API C##name 

def_export_struct( SomeOtherClassThatDoesSomething ) : public SomeDerivedClassThatDoesSomething 
{
//...
};
namespace mass_destruction {
    def_export_struct( Int )
    {
    //... (The point is that search and replace gets very unreliable in big projects)
    }
};

Это работает только для ctors и только на MSVC; Я использовал его, и, хотя это не большая функция, это облегчает жизнь.Это тривиальный пример, но представьте себе довольно сложную структуру. (Удобным побочным эффектом также является то, что у вас есть псевдоним в классе без необходимости отслеживать его имя.) Я что-то упустил? Неужели я действительно единственный, кому это нужно? Дело не в том, компилируется ли это, дело в том, что оно частично работает на меня и творит чудеса. Пока я не достигну стандарта... (Это не обсуждение соответствия.)

8
задан ActiveTrayPrntrTagDataStrDrvr 29 February 2012 в 15:19
поделиться