【问题标题】:Racket/Scheme C++ Extensions and InheritanceRacket/Scheme C++ 扩展和继承
【发布时间】:2014-01-22 19:20:25
【问题描述】:

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

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

Foo 类看起来像这样:

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

类栏看起来像这样:

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

我目前编写了一个 .cpp 球拍扩展,它创建 Bar 并为 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 作为超类的类。

任何建议都将不胜感激,如果你能指出一个例子(也许底层球拍代码中有一些东西你可以指出我?)

【问题讨论】:

    标签: c++ inheritance scheme racket


    【解决方案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)
    

    这就是她写的全部......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-18
      • 2014-07-10
      相关资源
      最近更新 更多