РЕДАКТИРОВАТЬ: Это обсуждение наилучшей практики в (упрощенном) случае, представленном ниже.Какой бы инструмент, стиль кодирования или что-то еще вы хотели бы предложить, опубликуйте его.Спасибо.
Почему нет специальных способов объявить или определить 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;Я использую его, и, хотя это не большая особенность, это облегчает жизнь.Это тривиальный пример, но представьте себе довольно сложную структуру.(Удобным побочным эффектом также является то, что у вас есть псевдоним в классе без необходимости отслеживать его имя.) Я что-то упустил?Неужели я действительно единственный, кому это нужно? Дело не в том, компилируется ли оно, а в том, что он частично работает для меня повсюду, и это творит чудеса.Пока я не достигну стандарта ... (Это не обсуждение соответствия.)