pub_u2;=pub;} ~MyOrderListener(){delete pub;} void onNewOrder(order::OrderTracker&OrderTracker)=覆盖; 私人: 我的酒吧*酒吧; }; MyOrderListener*listener;//orderTracker->AddOrderListener(listener); }; 枚举类BeerType { 房子 啤酒, 苍白的, IPA }; 普通啤酒 { 公众: Beer():类型{BeerType::House},价格{5.99}{} ~Beer()=默认值; BeerType getType(){返回此->类型}; float getBeerPrice(){返回此->价格}; 私人: 蜂型; 浮动价格; 无效设定价格(浮动价格); void setType(BeerType类型); }; }//命名空间发布结束,java,c++,swig,Java,C++,Swig" /> pub_u2;=pub;} ~MyOrderListener(){delete pub;} void onNewOrder(order::OrderTracker&OrderTracker)=覆盖; 私人: 我的酒吧*酒吧; }; MyOrderListener*listener;//orderTracker->AddOrderListener(listener); }; 枚举类BeerType { 房子 啤酒, 苍白的, IPA }; 普通啤酒 { 公众: Beer():类型{BeerType::House},价格{5.99}{} ~Beer()=默认值; BeerType getType(){返回此->类型}; float getBeerPrice(){返回此->价格}; 私人: 蜂型; 浮动价格; 无效设定价格(浮动价格); void setType(BeerType类型); }; }//命名空间发布结束,java,c++,swig,Java,C++,Swig" />

如何传递std::vector<;用户定义类>;通过Swig将数据传输到Java? 我有下面的C++库,我想用Sigg在java中使用它来生成必要的胶粘代码。但是,我发现很难向用户发送一个用户定义的向量,这些C++有一些数据。我尝试使用std_vector.I但是Swig仍然生成SWIGTYPE\u p_std_vecort\u namespace\u Beer,这与SwigVector实例不匹配 %module pub %include "std_vector.i" namespace std { %template(SwigVector) std::vector<Beer>; } %模块发布 %包括“标准向量i” 名称空间标准{ %模板(SwigVector)std::vector; } %{ #包括“Pub.h” #包括“MyPub.h” #包括“Beer.h” 使用名称空间发布; %} %包括“Pub.h” ... 名称空间顺序{ 类OrderTracker { 公众: 类OrderListener { 公众: OrderListener():orderTracker_{nullptr}{} 虚拟用户(OrderTracker&)=0; 私人: 朋友类订单跟踪器; void setOrderTracker(OrderTracker*OrderTracker) { orderTracker \=orderTracker; } OrderTracker*OrderTracker\ux; }; void addOrderListner(OrderListener&); }; 阶级地位; ... }//结束命名空间顺序 命名空间发布{ 班级酒吧 { 公众: virtual~Pub()=默认值; 虚拟void initOrder()=0; 虚拟std::vector getBeers()=0; ... }; MyPub类:公共酒吧 { 公众: void initOrder()覆盖; std::vector getBeers()覆盖; void generateBill()覆盖; ... 私人: order::OrderTracker*OrderTracker; 类MyOrderListener:public order::OrderTracker::OrderListener { 公众: 显式MyOrderListener(MyPub*pub){this->pub_u2;=pub;} ~MyOrderListener(){delete pub;} void onNewOrder(order::OrderTracker&OrderTracker)=覆盖; 私人: 我的酒吧*酒吧; }; MyOrderListener*listener;//orderTracker->AddOrderListener(listener); }; 枚举类BeerType { 房子 啤酒, 苍白的, IPA }; 普通啤酒 { 公众: Beer():类型{BeerType::House},价格{5.99}{} ~Beer()=默认值; BeerType getType(){返回此->类型}; float getBeerPrice(){返回此->价格}; 私人: 蜂型; 浮动价格; 无效设定价格(浮动价格); void setType(BeerType类型); }; }//命名空间发布结束

如何传递std::vector<;用户定义类>;通过Swig将数据传输到Java? 我有下面的C++库,我想用Sigg在java中使用它来生成必要的胶粘代码。但是,我发现很难向用户发送一个用户定义的向量,这些C++有一些数据。我尝试使用std_vector.I但是Swig仍然生成SWIGTYPE\u p_std_vecort\u namespace\u Beer,这与SwigVector实例不匹配 %module pub %include "std_vector.i" namespace std { %template(SwigVector) std::vector<Beer>; } %模块发布 %包括“标准向量i” 名称空间标准{ %模板(SwigVector)std::vector; } %{ #包括“Pub.h” #包括“MyPub.h” #包括“Beer.h” 使用名称空间发布; %} %包括“Pub.h” ... 名称空间顺序{ 类OrderTracker { 公众: 类OrderListener { 公众: OrderListener():orderTracker_{nullptr}{} 虚拟用户(OrderTracker&)=0; 私人: 朋友类订单跟踪器; void setOrderTracker(OrderTracker*OrderTracker) { orderTracker \=orderTracker; } OrderTracker*OrderTracker\ux; }; void addOrderListner(OrderListener&); }; 阶级地位; ... }//结束命名空间顺序 命名空间发布{ 班级酒吧 { 公众: virtual~Pub()=默认值; 虚拟void initOrder()=0; 虚拟std::vector getBeers()=0; ... }; MyPub类:公共酒吧 { 公众: void initOrder()覆盖; std::vector getBeers()覆盖; void generateBill()覆盖; ... 私人: order::OrderTracker*OrderTracker; 类MyOrderListener:public order::OrderTracker::OrderListener { 公众: 显式MyOrderListener(MyPub*pub){this->pub_u2;=pub;} ~MyOrderListener(){delete pub;} void onNewOrder(order::OrderTracker&OrderTracker)=覆盖; 私人: 我的酒吧*酒吧; }; MyOrderListener*listener;//orderTracker->AddOrderListener(listener); }; 枚举类BeerType { 房子 啤酒, 苍白的, IPA }; 普通啤酒 { 公众: Beer():类型{BeerType::House},价格{5.99}{} ~Beer()=默认值; BeerType getType(){返回此->类型}; float getBeerPrice(){返回此->价格}; 私人: 蜂型; 浮动价格; 无效设定价格(浮动价格); void setType(BeerType类型); }; }//命名空间发布结束,java,c++,swig,Java,C++,Swig,以下是我所期望的行为 public class main { public static void main(String argv[]) { System.loadLibrary("mypub"); MyPub pub = new MyPub(); pub.initOrder(); while(money > 1000) { SwigVector beers = pub.ge

以下是我所期望的行为

public class main
{
    public static void main(String argv[])
    {
        System.loadLibrary("mypub");
        MyPub pub = new MyPub();
        pub.initOrder();
        while(money > 1000)
        {
         SwigVector beers = pub.getBeers();
            for(int i =0; i<beers.size(); ++i){
            beers[i].getPrice();
            }
        }
   }
}
公共类主
{
公共静态void main(字符串argv[])
{
System.loadLibrary(“mypub”);
MyPub pub=新建MyPub();
pub.initOrder();
而(金钱>1000)
{
SwigVector beers=pub.getBeers();

对于(int i=0;i这应该可以。顺序很重要。请确保在使用类之前定义类:

%module pub

%include "std_vector.i"

%inline %{

enum class BeerType
{
    House,
    Lager,
    Pale,
    IPA
};

class Beer
{
public:
    Beer() : type{BeerType::House}, price{5.99f} {}
    ~Beer() = default;

    BeerType getType() {return this->type; }
    float getBeerPrice() {return this->price; }

private:
    BeerType type;
    float price;

    void setPrice(float price) { this->price = price; }
    void setType(BeerType type) { this->type = type; }
};

%}

%template(SwigVector) std::vector<Beer>;

%inline %{

class Pub
{
public:
    virtual ~Pub() = default;
    virtual void initOrder() = 0;
    virtual std::vector<Beer> getBeers() = 0;
    virtual void generateBill() = 0;
};

class MyPub : public Pub
{
public:
    void initOrder() override {}
    std::vector<Beer> getBeers() override { return {Beer(),Beer()}; }
    void generateBill() override {}
};

%}
%模块发布
%包括“标准向量i”
%内联%{
枚举类BeerType
{
房子
啤酒,
苍白的,
IPA
};
普通啤酒
{
公众:
Beer():类型{BeerType::House},价格{5.99f}{}
~Beer()=默认值;
BeerType getType(){返回此->类型;}
float getBeerPrice(){返回此->价格;}
私人:
蜂型;
浮动价格;
void setPrice(浮动价格){this->price=price;}
void setType(BeerType类型){this->type=type;}
};
%}
%模板(SwigVector)std::vector;
%内联%{
班级酒吧
{
公众:
virtual~Pub()=默认值;
虚拟void initOrder()=0;
虚拟std::vector getBeers()=0;
虚拟void generateBill()=0;
};
MyPub类:公共酒吧
{
公众:
void initOrder()重写{}
std::vector getBeers()重写{return{Beer(),Beer()};}
void generateBill()重写{}
};
%}
%module pub

%include "std_vector.i"

%inline %{

enum class BeerType
{
    House,
    Lager,
    Pale,
    IPA
};

class Beer
{
public:
    Beer() : type{BeerType::House}, price{5.99f} {}
    ~Beer() = default;

    BeerType getType() {return this->type; }
    float getBeerPrice() {return this->price; }

private:
    BeerType type;
    float price;

    void setPrice(float price) { this->price = price; }
    void setType(BeerType type) { this->type = type; }
};

%}

%template(SwigVector) std::vector<Beer>;

%inline %{

class Pub
{
public:
    virtual ~Pub() = default;
    virtual void initOrder() = 0;
    virtual std::vector<Beer> getBeers() = 0;
    virtual void generateBill() = 0;
};

class MyPub : public Pub
{
public:
    void initOrder() override {}
    std::vector<Beer> getBeers() override { return {Beer(),Beer()}; }
    void generateBill() override {}
};

%}