gpt4 book ai didi

c++ - 有没有一种特殊的方法来声明/定义 C++ 构造函数(和析构函数)

转载 作者:可可西里 更新时间:2023-11-01 17:42:20 26 4
gpt4 key购买 nike

编辑:这是关于下面介绍的(简化)案例中的最佳实践的讨论。无论您想要建议什么工具、编码风格或其他东西,请将其发布。谢谢。

为什么没有特殊的方法来声明或定义 ctors/dtors 而无需复制类名?这很烦人,尤其是在制作原型(prototype)并最终大量更改类名时。

我的意思是像这样使用 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;我一直在使用它,虽然不是什么大功能,但它让生活更轻松。这是一个微不足道的例子,但想象一个相当复杂的结构。(一个方便的副作用是你在类里面有一个别名而不必跟踪它的名字。) 我错过了什么吗?我真的是唯一需要这个的人吗?关键不在于它是否编译,关键在于我已经让它部分地为我在所有地方工作并且它确实很神奇。直到我达到标准……(这不是合规性讨论。)

最佳答案

听说过搜索替换吗?

我想大多数人要么使用 exvimsed。 etc: s/search/replace/g 或等同于更改类的名称,或者不要经常更改它们,因为缺少此功能而感到不安。

您可以使用 #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

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

关于c++ - 有没有一种特殊的方法来声明/定义 C++ 构造函数(和析构函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9501102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com