是否有一种特殊的方式来声明/定义C++构造函数(和析构函数)

Act*_*rvr 8 c++ constructor destructor typedef visual-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)
    }
};
Run Code Online (Sandbox Code Playgroud)

它仅适用于ctors,仅适用于MSVC; 我一直在使用它,虽然不是一个很大的功能,但它让生活更轻松.这是一个简单的例子,但想象一个相当复杂的结构.(一个方便的副作用是你在课堂上有一个别名,而不必追踪它的名字.)我错过了什么吗?我真的是唯一需要这个吗?重点不在于它是否编译,关键在于我已经让它部分地为我工作并且它确实有奇迹.直到达到标准...... (这不是合规性讨论.)

Jam*_*mes 6

有没有听说过搜索和替换?

我想,大多数人要么使用ex,vim,sed.etc:s/search/replace/g或等效于更改其类的名称,或者不要更改它们通常因缺少此功能而感到不安.

您可以使用a #define来执行此操作:

#define THIS_CLASS MyLongClassNameThatIChangeLotsAndLots
class THIS_CLASS{
    THIS_CLASS() { PrepareToDie(); }
    THIS_CLASS(int a) : _a(a) { PrepareToDie(); }
    THIS_CLASS(float a, int b) : _b(a), _a(b) { PrepareToDie(); }
    THIS_CLASS(float a, char * b) : _b(a), _c(b) { PrepareToDie(); }
    THIS_CLASS(char * a, int b) : _c(a), _a(b) { PrepareToDie(); }
    THIS_CLASS(THIS_CLASS &rhs) {  }
    ~THIS_CLASS() {}
};
#undef THIS_CLASS
Run Code Online (Sandbox Code Playgroud)

令人沮丧的是,我同意,缺乏一种标准方式来引用类型的基类 - 我通常私有地typedef ... base_t在类中,然后将其用于初始化列表等.

  • @UmNyobe你应该赞成已经包含`PrepareToDie()`的问题 (2认同)