Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 新对象的C等价物(构造函数)_C++_C - Fatal编程技术网

C++ 新对象的C等价物(构造函数)

C++ 新对象的C等价物(构造函数),c++,c,C++,C,下面的C等价物(malloc)是什么 MyClass* ptr = new MyClass(arg1,arg2); 我想到的第一件事是在堆栈上实例化一个MyClass对象,然后执行malloc(sizeof(MyClass))没有。您可以遵循以下方案: typedef struct NamespaceClassData { ... } NamespaceClass; NamespaceClass* namespace_class_create(T arg1, U arg2) {

下面的C等价物(malloc)是什么

MyClass* ptr = new MyClass(arg1,arg2);
我想到的第一件事是在堆栈上实例化一个MyClass对象,然后执行
malloc(sizeof(MyClass))memcpy(堆栈,到内存)


有更好的方法吗?

这不容易做到,因为
malloc
(或C语言本身)不知道类似“构造函数”的东西

请注意,对于任何与内存管理相关的操作,以下解决方法都是不安全的

MyClass* ptr = malloc(sizeof(MyClass));
*ptr = MyClass(arg1, arg2);

这不容易做到,因为malloc(或C语言本身)不知道类似“构造函数”的东西

请注意,对于任何与内存管理相关的操作,以下解决方法都是不安全的

MyClass* ptr = malloc(sizeof(MyClass));
*ptr = MyClass(arg1, arg2);
C中构造函数的等价物(或替代物)是初始值设定项。您可以在构造复合文字(另一个C特性)时使用这样的初始值设定项,并通过赋值初始化新对象

MyClass* ptr = malloc(sizeof *ptr);
*ptr = (MyClass){ .a = 1, .b = 34 };
系统地这样做的惯例可能是始终具有“init”函数

然后在指针初始化时调用它

MyClass* ptr = MyClass_init(malloc(sizeof *ptr), arg1,arg2);
C中构造函数的等价物(或替代物)是初始值设定项。您可以在构造复合文字(另一个C特性)时使用这样的初始值设定项,并通过赋值初始化新对象

MyClass* ptr = malloc(sizeof *ptr);
*ptr = (MyClass){ .a = 1, .b = 34 };
系统地这样做的惯例可能是始终具有“init”函数

然后在指针初始化时调用它

MyClass* ptr = MyClass_init(malloc(sizeof *ptr), arg1,arg2);

是的,只需将您需要的任何数据放入
malloc
ed内存,这就是构造。

是的,只需将您需要的任何数据放入
malloc
ed内存,这就是构造。

没有。您可以遵循以下方案:

typedef struct NamespaceClassData {
    ...
} NamespaceClass;

NamespaceClass* namespace_class_create(T arg1, U arg2) {
   // malloc and initialize
}

void namespace_class_destroy(MyClass* p) {
   // destroy and free
}

注释:虽然结构X是C++中的一种类型,但它只是C中的一个标记(因此TyBueFuffStutt)

< P>没有。您可以遵循以下方案:

typedef struct NamespaceClassData {
    ...
} NamespaceClass;

NamespaceClass* namespace_class_create(T arg1, U arg2) {
   // malloc and initialize
}

void namespace_class_destroy(MyClass* p) {
   // destroy and free
}

注释:虽然结构X是C++中的一种类型,但它只是C中的一个标记(因此,TyBeIFF结构)

,这只在类非常简单,支持浅拷贝时才起作用。 我已经有一段时间没有编写c代码了,但我要做的是创建一个init函数(init()),它的作用类似于ctor,并创建一个宏来分配内存(maloc),然后调用init(##init())。 比如:

  1 #define NEW(TYPE, NAME) malloc(sizeof(TYPE));\
  2                         init_ ##TYPE(NAME);

只有当您的类非常简单并且支持浅层复制时,这才有效。 我已经有一段时间没有编写c代码了,但我要做的是创建一个init函数(init()),它的作用类似于ctor,并创建一个宏来分配内存(maloc),然后调用init(##init())。 比如:

  1 #define NEW(TYPE, NAME) malloc(sizeof(TYPE));\
  2                         init_ ##TYPE(NAME);

C语言中没有类-除了malloc,你还想做什么?只需通过
ptr->…=arg1
通常,只需调用
calloc()
——这将分配空间并将所有字节设置为零。如果需要专门设置值,则单独设置字段。引入一个函数
make_my_class
,您可以将其称为
MyClass*ptr=make_my_class(arg1,arg2)之前询问-好的做法是使函数类似于构造函数(初始值设定项),其名称与结构名称相同。C中没有类-除了malloc,您还想做什么?只需通过
ptr->…=arg1
通常,只需调用
calloc()
——这将分配空间并将所有字节设置为零。如果需要专门设置值,则单独设置字段。引入一个函数
make_my_class
,您可以将其称为
MyClass*ptr=make_my_class(arg1,arg2)之前询问-好的做法是使函数类似于构造函数(初始值设定项),其名称与结构名称相同。哪个编译器支持这一点:
*ptr=(MyClass){.a=1,.b=34}?这是标准吗?@Jefferson这是标准C99。似乎VS2012和VS2013都不支持它。@Jefferson,MS拒绝在他们的编译器中实现更新的C标准。他们现在在这件事上几乎是孤军奋战。只是不要将他们的编译器用于C。是的-看起来他们更喜欢C++11(),尽管他们强调C99库支持:哪个编译器支持这个:
*ptr=(MyClass){.a=1,.b=34}?这是标准吗?@Jefferson这是标准C99。似乎VS2012和VS2013都不支持它。@Jefferson,MS拒绝在他们的编译器中实现更新的C标准。他们现在在这件事上几乎是孤军奋战。只是不要将他们的编译器用于C。是的-看起来他们更喜欢C++11(),尽管他们强调C99库支持: