6.17 类扩展

使用%extend指令可以为类添加新方法。这个指令主要被与代理类连接,用于给存在的类添加额外的功能。例如:

%module vector
%{
#include "vector.h"
%}

class Vector {
public:
    double x,y,z;
      Vector();
    ~Vector();

    ... bunch of C++ methods ...

    %extend {
      char *__str__() {
        static char temp[256];
        sprintf(temp,"[ %g, %g, %g ]", $self->x,$self->y,$self->z);
        return &temp[0];
       }
   }
};

这段代码给我们的类添加了一个__add__方法,生成对象的字符串表示。在Python中,这样的方法允许我们使用print名字打印对象的值。

>>>
>>> v = Vector();
>>> v.x = 3
>>> v.y = 4
>>> v.z = 0
>>> print(v)
[ 3.0, 4.0, 0.0 ]
>>>

C++的this指针经常被用于访问成员变量、方法等。特殊标量$self应该用在你需要this的地方。上面的例子演示了使用这种方式访问成员变量的方法了。注意,通过$self引用的变量必须是公有的成员,因为这些代码最终会生成全局函数,所以不能访问任何非公有的成员。C++中隐式指针this在C++方法中可用,但在%extend指令中不可用。为了在扩展类或其基类中访问所有成员,必须使用显式的this。下面的例子演示了如何访问基类的成员:

struct Base {
  virtual void method(int v) {
  ...
  }
  int value;
};

struct Derived : Base {
};

%extend Derived {
  virtual void method(int v) {
    $self->Base::method(v);  // akin to this->Base::method(v);
    $self->value = v;         // akin to this->value = v;
    ...
  }
}

%extend指令块中,下面的特使变量将被扩展:$name$sysnameovername$decl$fulldeclparentclassname$parentclasssymname特殊变量这一节对每个特殊变量都做了详细介绍。

%extend指令与对C结构体处理方法是一样的。请参考给C结构体添加成员函数获得等多信息。

兼容性注释:%extend指令是 SWIG 1.1中%addmethods指令的新的名字。因为%addmethods不仅仅只是给结构体扩展方法,所以我们给它选择了另外一个更合适的指令名。

results matching ""

    No results matching ""