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;
- 指向本机的指针 class
AddClass
可能是指向纯虚拟 class/interface 的指针,或者可能包含纯虚拟的函数。
- 你用new创建的class(派生自
AddClass
),必须实现所有功能!
- 因此您有机会使用来自
AddClass
的不同派生 class 具有不同的行为。但是每个派生class必须实现所有的虚函数!
如果你有 C++ 或 C++/CLI,这并不重要。
我正在尝试用 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;
- 指向本机的指针 class
AddClass
可能是指向纯虚拟 class/interface 的指针,或者可能包含纯虚拟的函数。 - 你用new创建的class(派生自
AddClass
),必须实现所有功能! - 因此您有机会使用来自
AddClass
的不同派生 class 具有不同的行为。但是每个派生class必须实现所有的虚函数!
如果你有 C++ 或 C++/CLI,这并不重要。