C等价于新的Object(构造函数)

时间:2013-12-06 11:00:15

标签: c++ c

以下

的C等价物(使用malloc)是什么
MyClass* ptr = new MyClass(arg1,arg2);

我想到的第一件事是在堆栈上实例化MyClass对象,然后执行malloc(sizeof(MyClass));然后执行memcpy(stack, to_malloc'd_memory)

有更好的方法吗?

5 个答案:

答案 0 :(得分:4)

C中构造函数的等效(或替换)是初始化程序。您可以在构造复合文字(另一个C专业)时使用这样的初始化程序,并通过赋值初始化新对象。

MyClass* ptr = malloc(sizeof *ptr);
*ptr = (MyClass){ .a = 1, .b = 34 };

系统地这样做的惯例可能是始终具有“初始化”功能

inline
MyClass* MyClass_init(MyClass* ptr, T1 arg1, T2 arg2) {
   if (ptr) {
     *ptr = (MyClass){ .a = arg1, .b = arg2, };
   }
   return ptr;
}

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

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

答案 1 :(得分:2)

没有。你可以遵循这个方案:

typedef struct NamespaceClassData {
    ...
} NamespaceClass;

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

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

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

是的,只需将您需要的任何数据放入malloc内存 - p>

答案 4 :(得分:0)

只有当你的课非常简单,并且支持浅拷贝时,这才有效。 我现在没有编写c代码,但是我要做的是创建一个init函数(init()),它将像ctor一样工作,并创建一个宏来分配内存(maloc),然后调用init(## init())。 类似的东西:

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