首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在c中使用c++对象?

如何在c中使用c++对象?
EN

Stack Overflow用户
提问于 2012-08-15 22:21:54
回答 4查看 15.4K关注 0票数 7

我在我的visual studio里有两个项目: decoder和dec。一个包含C代码,另一个包含使用stl respectively.How的C++代码。我是否可以在解码项目中实例化c代码中的c++类?

代码语言:javascript
复制
for e.g.
//instantiating object
reprVectorsTree *r1 = new reprVectorsTree(reprVectors1,8);
//using one of its function
r1->decode(code);

我需要为此做些什么?

如何访问其他项目中的文件?

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

-edit-我有一个这样的类

代码语言:javascript
复制
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只允许结构体,我如何将其映射到结构体?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-15 22:29:59

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

magic.hpp:

代码语言:javascript
复制
struct Magic
{
    Magic(char const *, int);
    double work(int, int);
};

magic.cpp: (实现Magic。)

magic_interface.h:

代码语言:javascript
复制
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

magic_interface.cpp:

代码语言:javascript
复制
#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"并使用以下代码:

代码语言:javascript
复制
MHandle h = create_magic("Hello", 5);
double d = work_magic(h, 17, 29);
free_magic(h);

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

票数 27
EN

Stack Overflow用户

发布于 2012-08-15 22:27:24

使用C++导出的functions.And创建实例化C++对象的包装器,然后从C代码中调用这些函数来生成对象。

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

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

A few other ways.

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 22:31:28

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

如下所示:

在class.h中:

代码语言:javascript
复制
struct A{
   void f();
}

在class.cpp中:

代码语言:javascript
复制
void A::f(){
}

wrapper.cpp:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
struct A;
void fWrapper(struct A *a);
A *createA();

C程序:

代码语言:javascript
复制
#include "wrapper.h"
int main(){
    A *a;
    a=createA();
    fWrapper(a);
    deleteA(a);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11971063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档