c - 面向对象的C无法编译

标签 c oop constructor

我已经在 OOC 上浏览了此 pdf 的前几章:http://www.planetpdf.com/codecuts/pdfs/ooc.pdf

现在我尝试实现一个 String 类。我曾经使用过的文件:main.c 和 new2.h。

这是main.c:

#include "new2.h"
#include <stdio.h>

int main(){

    void * stringObject = new2(String,"a");

    printf((*stringObject).text);
}

这是 new2.h(包括空白代码,因为我删除了所有内容,只保留了我认为需要完成这项工作的基本要素)。

#include <stdarg.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>


struct Class{
    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 * b);

};

struct String{
    const void * mClass;//must be first
    char * text;

};

static void * String_ctor (void * _self, va_list * app)
{
    struct String * self = _self;
    const char * text = va_arg(* app, const char *);
    self->text = malloc(strlen(text)+1);

    assert(self->text);
    strcpy(self->text,text);
    return self;

}

static const struct Class _String ={
    sizeof(struct String),
    String_ctor

};



const void * String =&_String;



void * new2(const void * _class,...)
{
    const struct Class * mClass = _class;
    void * p = calloc(1,mClass->size);

    assert(p);
    *(const struct Class **)p = mClass;

    if(mClass -> ctor)
    {
        va_list ap;

        va_start(ap,_class);
        p=mClass->ctor(p, &ap);
        va_end(ap);
    }

    return p;

}

new2.h 中的所有函数均从 pdf 链接中逐字获取。 当我尝试使用 gcc 进行编译时,我收到警告。我正在取消引用 void 指针,并且出现错误,无法在 main.c 中调用字符串的文本,因为我的字符串不是 union 或结构。

说实话,我觉得 new2.h 令人困惑。正如我所说,我从 pdf 中复制了函数。 我认为会发生以下情况:

  1. new2 被调用。参数 String 告诉计算机创建一个指向 Class 结构的指针,并将其指向已经在 new2.h 中创建的 String 结构。
  2. 我们为 String 对象分配足够的内存。
  3. 我们调用构造函数 (String_ctor),并使用变量参数列表来获取 char 参数,在本例中为“a”。

我的理解很模糊,这段代码无法编译。任何帮助将不胜感激!

最佳答案

为了使这段代码能够编译替换

 void * stringObject

 struct String * stringObject

否则编译器无法确定.text字段的地址。

struct String 方法返回 void* 的一个原因是提供继承。只有调用程序知道正在使用 struct String 的哪个子类。

书中的示例可以保留void * stringObject,因为它们仅使用 String 类的“公共(public)”接口(interface),而从不进入内部访问其私有(private)成员。

打印字符串的另一种方法是使用打印字符串的方法扩展类或定义“友元”函数。

关于c - 面向对象的C无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10867995/

相关文章:

scala - 在 Scala 中为 DSL 的类型层次结构建模

c - 在 C 中调整数组大小

javascript 原型(prototype)与 this

wpf - 使用 WPF Prism/Mahapps HamburgerMenu 控件时调用参数化 View 模型构造函数

java - 避免并行继承层次结构

java - 使用泛型 <K> 减少重复代码?

c++ - 如何创建不可移动/复制构造的对象数组

c++ - 如何在 C++ win32 API 的对话框中设置图像?

c - OpenMP 循环上的段错误(核心转储)

c - 在堆上分配小内存块?