【发布时间】:2020-12-10 07:47:46
【问题描述】:
我正在阅读 C 中的 OOP,并且有这个标题:
#ifndef _NEW_H
#define _NEW_H
#include <stdarg.h>
#include <stddef.h>
#include <assert.h>
void *new (const void *type, ...);
void delete (void *item);
typedef struct
{
size_t size;
void *(*ctor)(void *self, va_list *app);
void *(*dtor)(void *self);
void *(*clone)(const void *self);
int (*differ)(const void *self, const void *x);
} class_t;
inline void *new (const void *_class, ...)
{
const class_t *class = _class;
void *p = calloc(1, class->size);
assert(p);
*(const class_t **)p = class; //why would you cast to double pointer, when you immediately dereference it?
if (class->ctor)
{
va_list args;
va_start(args, _class);
p = class->ctor(p, &args);
va_end(args);
}
return p;
}
#endif //_NEW_H
现在我不明白这个表达:
*(const class_t **)p = class;
const class_t ** 类型是什么意思?它就像一个数组数组?但是如果我想要自定义类(即不仅指向结构class_t 的指针,还有更多“公共”方法),则整个类不是class_t 类型的数组。那么为什么我要将一个 void 指针转换为双指针并立即取消引用它呢?应该怎么理解?
来自关于该声明的书:
* (const struct Class **) p = class;
p 指向对象的新内存区域的开始。我们 强制转换 p 将对象的开头视为 指向 struct class_t 的指针并将参数类设置为 这个指针。
【问题讨论】:
-
在 C 代码中看到
class是一个标志,因为这将是一场疯狂的旅程。 -
@tadman 但这就是重点。我从我在 c 中学习 OOP 的符号开始
-
考虑到 Objective-C 和 C++ 已经存在,更不用说其他鲜为人知的实验,我想知道为什么。
-
@tadman 因为例如内核使用 OOP 原则
-
所以双指针解引用一次回到指针然后放置类?添加 varg 黑魔法以获得乐趣,您将 va_list 堆栈变量的地址存储到类中然后让它超出范围?会出什么问题?希望 ctor 深拷贝。
标签: c class oop double-pointer