2014-01-22 92 views
2

因此,我一直在使用球拍網站上的教程(http://docs.racket-lang.org/inside/overview.html)爲一些C++類編寫一些球拍擴展,並且已經能夠成功地將它們加載到球拍中。然而,我想知道如果我可以使用繼承重用一些代碼。球拍/方案C++擴展和繼承

例如我有兩個我用C++,Foo和Bar編寫的類。

類Foo看起來是這樣的:

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

類酒吧看起來是這樣的:

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

我目前寫了創建酒吧,併爲雙方的擴展單一的.cpp球拍擴展func1()和func2();不過,我想創建兩個球拍擴展類。一個只在Foo內部運行的擴展,然後我只想在Bar_ext.h中包含Foo_ext.h(我的球拍擴展到Foo),這樣我就可以訪問所有的功能。

所以我現在有這樣的:

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類作爲超類的類。

任何意見,將不勝感激,如果你能指出我的一個例子(也許有東西在底層的球拍代碼,你可以指向我?)

回答

1

因此,解決的辦法是更直接的不是向前我原本以爲。謬誤是我想在另一個擴展中包含,這不是必需的。關鍵是創建擴展單獨實現你想暴露給球拍的每個功能,並且每個函數引用一個指向該對象的指針。例如:

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來完成。

在這裏,在這裏,你想用你的擴展球拍腳本,你同時需要擴展的關鍵:

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

而這一切,她寫道...