8

VisualStudioに2つのプロジェクトデコーダーとdecがあります。1つにはCコードがあり、もう1つにはstlを使用したC++コードがあります。デコードプロジェクト内の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インターフェースを与えます。

magic.hpp:

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

magic.cpp :(実装しMagicます。)

magic_interface.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

magic_interface.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);

( Cヘッダーで宣言しないように、どこにでもキャストを定義MHandleして追加することもできます。)void *struct Magic

于 2012-08-15T14:29:59.390 に答える
1

C++でエクスポートされた関数を使用してC++オブジェクトをインスタンス化するためのラッパーを作成し、Cコードからこれらの関数を呼び出してオブジェクトを生成します。

1つは関数指向で、もう1つはオブジェクト指向であるため、ラッパーでいくつかのアイデアを使用できます。

  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 に答える