【问题标题】:C equivalent of new Object(constructor)C 等价于 new Object(constructor)
【发布时间】:2013-12-23 16:55:04
【问题描述】:

以下的 C 等价物(使用 malloc)是什么

MyClass* ptr = new MyClass(arg1,arg2);

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

有没有更好的方法?

【问题讨论】:

  • C 中没有类——除了 malloc,你还想做什么?只需通过ptr->... = arg1 初始化分配的内存
  • 通常,只需调用calloc() - 这会分配空间并将所有字节设置为零。如果您需要专门设置值,则单独设置字段。
  • 引入一个函数make_my_class,你可以调用它为MyClass *ptr = make_my_class(arg1, arg2);
  • 之前询问过 - stackoverflow.com/questions/3774193/… 好的做法是使函数类似于构造函数(初始化器),其名称与结构名称相同。

标签: c++ c


【解决方案1】:

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

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 struct)

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

        是的,只需将您需要的任何数据放入malloced 内存中——这就是构造

        【讨论】:

          【解决方案5】:

          C 中构造函数的等价物(或替代物)是初始化器。您可以在复合文字(另一个 C 特长)的构造中使用这样的初始化程序,并通过赋值初始化您的新对象。

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

          系统地这样做的惯例可能是总是有一个“init”函数

          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);
          

          【讨论】:

          • 哪个编译器支持这个:*ptr = (MyClass){ .a = 1, .b = 34 };?这是标准吗?
          • @JeffRSon 这是标准 C99。
          • 好像VS2012和VS2013都不支持。
          • @JeffRSon,MS 拒绝在其编译器中实现更新的 C 标准。如今,他们几乎独自一人。只是不要将他们的编译器用于 C。
          • 是的 - 似乎他们更喜欢 C++11 (stackoverflow.com/questions/18731707/…),尽管他们强调 C99 库支持:blogs.msdn.com/b/vcblog/archive/2013/07/19/…
          猜你喜欢
          • 2011-10-01
          • 1970-01-01
          • 2010-10-15
          • 2018-09-03
          • 2020-05-29
          • 2010-11-11
          • 2018-01-25
          • 2023-03-18
          相关资源
          最近更新 更多