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

时间:2018-07-18 04:08:06

标签: c++ c++-cli wrapper labview

我正在尝试在c ++ / CLI中编写一个dll包装器,以连接要在LabView中使用的本机c ++类中的函数。我已经成功地编写了一个包装程序来执行此操作,并且一切都按预期工作(见下文)。该问题在底部解释(在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中实例化(从现在的抽象类)。在解决此问题方面,我将非常感谢您的帮助。

virtual bool toggle (bool test) = 0;

1 个答案:

答案 0 :(得分:0)

  1. 本机类AddClass的指针可以是纯虚拟类/接口的指针,也可以包含纯虚拟函数。
  2. 使用new创建的类(源自AddClass)必须实现所有功能!
  3. 因此,您有机会使用具有不同行为的AddClass中的不同派生类。但是每个派生类都必须实现所有虚函数!

这是否有C ++或C ++ / CLI都不重要。