8

我的视觉工作室中有 2 个项目解码器和解码器。一个有 C 代码,另一个有 C++ 代码,分别使用 stl。如何在解码项目中的 c 代码中实例化 c++ 类?

for e.g.
//instantiating object
reprVectorsTree *r1 = new reprVectorsTree(reprVectors1,8);
//using one of its function
r1->decode(code);

我需要为此做些什么?

如何从另一个项目访问文件?

如何在 C 文件中使用现有的 c++ 代码?

--------编辑---------我有这样的课

class Node//possible point in our input space
{
public:
    std::vector<float> valuesInDim;//values in dimensions
    std::vector<bool> code;
    Node(std::vector<float>value);
    Node::Node(float x, float y);
Node::Node(std::vector<float> value,std::vector<bool> binary);


};

如何在 c++ 中使用上述类?如果 C 只允许结构,我如何将它映射到结构?

4

4 回答 4

28

给 C++ 模块一个 C 接口:

魔术.hpp:

struct Magic
{
    Magic(char const *, int);
    double work(int, int);
};

magic.cpp:(实现Magic。)

魔术接口.h:

struct Magic;

#ifdef __cplusplus
extern "C" {
#endif

typedef Magic * MHandle;
MHandle create_magic(char const *, int);
void    free_magic(MHandle);
double  work_magic(MHandle, int, int);

#ifdef __cplusplus
}
#endif

魔术接口.cpp:

#include "magic_interface.h"
#include "magic.hpp"

extern "C"
{
    MHandle create_magic(char const * s, int n) { return new Magic(s, n); }
    void    free_magic(MHandle p) { delete p; }
    double  work_magic(MHandle p, int a, int b) { return p->work(a, b); }
}

现在一个 C 程序可以#include "magic_interface.h"并使用以下代码:

MHandle h = create_magic("Hello", 5);
double d = work_magic(h, 17, 29);
free_magic(h);

(您甚至可能想在任何地方定义MHandleasvoid *并添加强制转换,以避免struct Magic在 C 标头中声明。)

于 2012-08-15T14:29:59.390 回答
1

使用 C++ 导出函数制作用于实例化 C++ 对象的包装器。然后从 C 代码中调用这些函数以生成对象。

由于一个是面向函数的,另一个是面向对象的,因此您可以在包装器中使用一些想法:-

  1. 为了复制类成员,将一个等效的预先指定的结构从 C 代码传递到相应的 C++ 函数以获取数据。
  2. 尝试使用函数指针,因为它会降低成本,但要小心它们也可能被利用。

其他几种方式。

于 2012-08-15T14:27:23.887 回答
0

您需要用 C 编写一个包装器。

像这样的东西:

在 class.h 中:

struct A{
   void f();
}

在 class.cpp 中:

void A::f(){
}

包装器.cpp:

#include "wrapper.h"
void fWrapper(struct A *a){a->f();};
struct A *createA(){
   A *tmp=new A();
   return tmp;
}

void deleteA(struct A *a){
 delete a;
}

C 的 wrapper.h:

struct A;
void fWrapper(struct A *a);
A *createA();

C程序:

#include "wrapper.h"
int main(){
    A *a;
    a=createA();
    fWrapper(a);
    deleteA(a);
}
于 2012-08-15T14:31:27.813 回答
0

简单来说,您只需执行以下操作:

  1. 编写一个接口函数,将所有类函数(构造函数、析构函数、成员函数)转换为纯函数,并封装为extern "C"{ }
  2. 将指向类的指针转换为指向 void 的指针,并在定义“纯函数”的任何地方小心地使用类型转换
  3. 在 C 代码中调用纯函数。

例如,这是我的简单 Rectangle 类:

/*** Rectangle.h ***/
class Rectangle{
private:
    double length;
    double breadth;
public:
    Rectangle(double iLength, double iBreadth);
    ~Rectangle();
    double getLength();
    double getBreadth();
};

/*** Rectangle.cpp ***/
#include "Rectangle.h"
#include <iostream>
extern "C" {
    Rectangle::Rectangle(double l, double b) {
        this->length = l;
        this->breadth = b;
    }

    Rectangle::~Rectangle() {
        std::cout << "Deleting object of this class Rectangle" << std::endl;
    }

    double Rectangle::getLength() {
        return this->length;
    }

    double Rectangle::getBreadth() {
        return this->breadth;
    }
}

现在这是我将类函数转换为纯函数的接口。注意指向类的指针是如何处理的!

/*** RectangleInterface.h ***/
#ifdef __cplusplus
extern "C" {
#endif
    typedef void * RHandle;
    RHandle create_Rectangle(double l, double b);
    void    free_Rectangle(RHandle);
    double  getLength(RHandle);
    double  getBreadth(RHandle);

#ifdef __cplusplus
}
#endif

/*** RectangleInterface.cpp ***/ 
#include "RectangleInterface.h"
#include "Rectangle.h"
extern "C"
{
    RHandle create_Rectangle(double l, double b){
        return (Rectangle*) new Rectangle(l, b);
    };
    void free_Rectangle(RHandle p){
        delete (Rectangle*) p;
    }
    double getLength(RHandle p){
        return  ((Rectangle*) p)->getLength();
    }
    double getBreadth(RHandle p){
        return ((Rectangle*)p)->getBreadth();
    }
}

现在我可以在我的“.c”文件中使用这些接口函数,如下所示。我只需在此处包含 RectangleInterface.h 函数,其余部分由其函数处理。

/*** Main function call ***/
#include <stdio.h>
#include "RectangleInterface.h"

int main()
{
    printf("Hello World!!\n");
    RHandle myRec = create_Rectangle(4, 3);
    printf("The length of the rectangle is %f\n", getLength(myRec));
    printf("The area of the rectangle is %f\n", (getLength(myRec)*getBreadth(myRec)));
    free_Rectangle(myRec);
    return 0;
}
于 2021-02-18T22:34:12.303 回答