Я пытаюсь написать оболочку dll в C++ / CLI для подключения функций в моем собственном классе C++ для использования в 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:
введите описание изображения здесь
Проблема
когда я меняю заголовочный файл на чистый виртуальный, мой код больше не работает. Это потому, что я пытаюсь создать экземпляр (из теперь уже абстрактного класса) в оболочке .cpp. Я был бы очень признателен за помощь в решении этой проблемы.
virtual bool toggle (bool test) = 0;
Он объявлен / реализован на родном C++. Это AddClass
Вы сказали, что объявили его чисто виртуальным.
Правильно, я изначально объявил его виртуальным, и он работал нормально. Как только я сделал его чисто виртуальным, код сломался.
Потому что вы нигде не реализовали чистый виртуальный метод.





AddClass может быть указателем на чистый виртуальный класс / интерфейс или может содержать чисто виртуальные функции.AddClass), должны быть реализованы все функции!AddClass с различным поведением. Но в каждом производном классе должны быть реализованы все виртуальные функции!Это не имеет значения, если у вас C++ или C++ / CLI.
Спасибо за ответ, сегодня попробую еще раз. Меня немного смущает, когда вы говорите, что класс создан с помощью new, поскольку new просто создает экземпляр класса Add.
Вы должны создать производный класс! Вы не можете создать AddClass, если у него есть чисто виртуальные члены.
В каком классе вы реализуете виртуальную функцию?