c++\CLI dll 包装器调用 c++ 中的虚拟成员 class

c++\CLI dll wrapper to call virtual members in c++ class

我正在尝试用 c++/CLI 编写一个 dll 包装器来连接我的本机 c++ class 中的函数,以便在 LabView 中使用。我已经成功地编写了一个包装器来执行此操作,并且一切都按预期工作(见下文)。问题在底部解释(在 Labview 图像之后)。

本机 c++ 头文件。

//native c++ header
#pragma once

namespace AddTwoNumbersLib
{
class AddClass
{
private:
    double _x;
    double _y;
    bool _test;

public:
    //Constructor
    AddClass();

    //Member functions
    virtual bool toggle (bool test);
    double Add(double x, double y);
    static double subtract(double z, double a);
};
}

本机 c++ .cpp 文件。

// native c++ .cpp
#include "stdafx.h"
#include "AddClass.h"

namespace AddTwoNumbersLib
{
//Constructor
AddClass::AddClass()
{}

//Member functions
double AddClass::Add(double x, double y)
{
    _x = x;
    _y = y;
    return _x + _y;
}

double AddClass::subtract(double z, double a) 
{
    return z - a;
}

bool AddClass::toggle(bool test)
{
    _test = test;
    return _test;
}
}

包装器 c++/CLi 头文件。

// ClrWrapper.h

#pragma once

using namespace System;

namespace ClrWrapper {

public ref class MathWrap
{
private:
    AddTwoNumbersLib::AddClass *_MyManagedAdd;
    AddTwoNumbersLib::AddClass *_push;

public:
    //Constructs an instance of the class and an
    //instance of the underliying native class AddClass
    MathWrap();
    ~MathWrap();

    double AddWrapper(double x, double y);
    double subWrap(double z, double a);
    bool toggleWrap(bool push);
};
}

包装器 c++/CLI .cpp 文件

// This is the main DLL file.

#include "stdafx.h"

#include "ClrWrapper.h"

using namespace ClrWrapper;

MathWrap::MathWrap()
{
_MyManagedAdd = new AddTwoNumbersLib::AddClass();
_push = new AddTwoNumbersLib::AddClass();
}

MathWrap::~MathWrap()
{
delete _MyManagedAdd;
}

double MathWrap::AddWrapper(double x, double y)
{
return _MyManagedAdd->Add(x, y);
//return AddTwoNumbersLib::AddClass::Add(x, y);
}

double MathWrap::subWrap(double z, double a)
{
return AddTwoNumbersLib::AddClass::subtract(z, a);
}

bool MathWrap::toggleWrap(bool push)
{
return _push->toggle(push);
}

LabView 结果:

enter image description here

问题

当我将头文件更改为纯虚拟时,我的代码不再有效。这是因为我试图在包装器 .cpp 中实例化(从现在的抽象 class)。如果能帮我解决这个问题,我将不胜感激。

virtual bool toggle (bool test) = 0;
  1. 指向本机的指针 class AddClass 可能是指向纯虚拟 class/interface 的指针,或者可能包含纯虚拟的函数。
  2. 你用new创建的class(派生自AddClass),必须实现所有功能!
  3. 因此您有机会使用来自 AddClass 的不同派生 class 具有不同的行为。但是每个派生class必须实现所有的虚函数!

如果你有 C++ 或 C++/CLI,这并不重要。