以下
的C等价物(使用malloc)是什么MyClass* ptr = new MyClass(arg1,arg2);
我想到的第一件事是在堆栈上实例化MyClass对象,然后执行malloc(sizeof(MyClass));
然后执行memcpy(stack, to_malloc'd_memory)
有更好的方法吗?
答案 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);