gpt4 book ai didi

c++ - Racket/Scheme C++ 扩展和继承

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:33 27 4
gpt4 key购买 nike

所以我一直在使用 racket 站点上的教程 (http://docs.racket-lang.org/inside/overview.html) 为一些 C++ 类编写一些 racket 扩展,并且能够成功地将它们加载到 racket 中。但是我想知道我是否可以使用继承来重用一些代码。

例如,我有两个用 C++ 编写的类,Foo 和 Bar。

类 Foo 看起来像这样:

Foo { 
func1() { /* ... do stuff */ }
}

类栏看起来像这样:

Bar : Foo {
func2() { /*... do more stuff /*}
}

我目前已经编写了一个 .cpp Racket 扩展,它创建了 Bar 并为 func1() 和 func2() 创建了扩展;但是,我想创建两个 Racket 扩展类。一个仅在 Foo 内部起作用的扩展,然后我只想在 Bar_ext.h 中包含 Foo_ext.h(我对 Foo 的 Racket 扩展),这样我就可以访问所有功能。

所以我现在有这个:

Bar_ext.cpp:

func1_racket_ext() { /*... do racket stuff and run func1() */} 


func2_racket_ext() {/* ... do more racket stuff and run func2() /*}


/* Scheme initializes etc... */

但我真正想要的是:

Foo_ext.h:

func1_racket_ext() { /*... do racket stuff and run func1() */} 



/* Scheme initializes etc... */

Bar_ext.cpp:

#include "Foo_ext.h" 


func2_racket_ext() {/* ... do more racket stuff and run func2() /*}



/* Scheme initializes etc... */

这可能吗?我觉得命名空间可能是个问题。这对我来说非常有用,因为它允许我不编写大量冗余代码,因为我有许多类使用 Foo 类作为父类(super class)。

任何建议将不胜感激,如果你能给我举个例子(也许底层 Racket 代码中有什么你可以给我指点?)

最佳答案

所以这个问题的解决方案比我原先想象的更直接。谬论是我想在另一个中包含扩展,这是没有必要的。关键是创建单独的扩展来实现您想要公开给 Racket 的每个功能,并且每个功能都引用一个指向该对象的指针。例如:

Foo_ext.cpp(伪代码)

static Foo * foo; 
Scheme_Object * create_foo(...) {
foo = new Foo();
return make_scheme_ptr(foo);
}

Scheme_Object * do_func1(..., Foo * f)
{
foo = f;
/* do func_1 stuff */
}

/* ... Do scheme stuff... */

然后将对 bar_ext 执行相同的代码。

这里的关键是,在您想要使用扩展的 Racket 脚本中,您需要两个扩展:

(require "Foo_ext.rkt") 
(require "Bar_ext.rkt")

; my_bar is the pointer to the bar created.
(define my_bar (create_bar))

; Pass 11 and the my_bar pointer to func1 declared in Foo_ext
(func1 11 my_bar)
; Pass 12 and the my_bar pointer to func2 declared in Bar_ext
(func2 12 my_bar)

这就是她写的全部...

关于c++ - Racket/Scheme C++ 扩展和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21291994/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com