因此,我一直在使用C++站点上的教程(http://docs.racket-lang.org/inside/overview.html)为一些类编写一些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中包含Bar_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作为超类使用。
任何建议都是非常感谢的,如果你能给我举一个例子(也许在底层的球拍代码中有什么东西你可以给我指点?)
发布于 2014-02-07 07:18:45
因此,解决这个问题的方法比我原先想象的要直接得多。谬误是,我想在另一个扩展中包括扩展,这是不必要的。关键是分别创建扩展,实现要公开给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)她只写了这些..。
https://stackoverflow.com/questions/21291994
复制相似问题