Оболочка C++ \ CLI dll для вызова виртуальных членов в классе C++

Я пытаюсь написать оболочку 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;

В каком классе вы реализуете виртуальную функцию?

tkausl 18.07.2018 06:12

Он объявлен / реализован на родном C++. Это AddClass

Jesse T-P 18.07.2018 06:41

Вы сказали, что объявили его чисто виртуальным.

tkausl 18.07.2018 06:53

Правильно, я изначально объявил его виртуальным, и он работал нормально. Как только я сделал его чисто виртуальным, код сломался.

Jesse T-P 18.07.2018 14:56

Потому что вы нигде не реализовали чистый виртуальный метод.

tkausl 18.07.2018 14:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
287
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Указатель на собственный класс AddClass может быть указателем на чистый виртуальный класс / интерфейс или может содержать чисто виртуальные функции.
  2. В классе, который вы создаете с помощью new (производный от AddClass), должны быть реализованы все функции!
  3. Таким образом, у вас есть возможность использовать разные производные классы от AddClass с различным поведением. Но в каждом производном классе должны быть реализованы все виртуальные функции!

Это не имеет значения, если у вас C++ или C++ / CLI.

Спасибо за ответ, сегодня попробую еще раз. Меня немного смущает, когда вы говорите, что класс создан с помощью new, поскольку new просто создает экземпляр класса Add.

Jesse T-P 18.07.2018 15:13

Вы должны создать производный класс! Вы не можете создать AddClass, если у него есть чисто виртуальные члены.

xMRi 18.07.2018 15:29

Другие вопросы по теме