член управляемого класса не может относиться к неуправляемому классу - PullRequest
0 голосов
/ 10 мая 2018

Я пишу программу на c ++ / clr и мне нужно кодировать лексический анализатор.И у меня есть эти:

std::map <std::string, int> classes = { { "keyword",0 },{ "identifier",0 },{ "digit",0 },{ "integer",0 },{ "real",0 },{ "character",0 },{ "alpha",0 } };
std::vector<std::string> ints = { "0","1","2","3","4","5","6","7","8","9" };
std::vector<std::string> keywords = { "if","else","then","begin","end" };
std::vector<std::string> identifiers = { "(",")","[","]","+","=",",","-",";" };
std::vector<std::string> alpha = { "a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z" };
std::vector<std::string>::iterator iter;

, так вот в чем проблема: он помечает classes, ints, keywords и т. Д. Как ошибку: a member of managed class cannot be of a non-managed class type

какя могу это исправить?

1 Ответ

0 голосов
/ 11 мая 2018

Я вижу, что вы используете C ++ / clr, поэтому я полагаю, у вас есть веская причина для этого.

Родные типы не могут быть членами класса Managed. Причина этого в том, что машина должна знать, когда уничтожать / освобождать память, занятую собственным кодом -> они находятся внутри класса управления, объекты которого уничтожаются сборщиком мусора.

В любом случае, вы можете использовать управляемые типы в качестве членов класса ... или указатели на нативные типы в качестве членов класса - не рекомендуется, если вы не хотите переводить с Manage на Native или наоборот. Вот пример:

// compile with: /clr
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <string>

using namespace System;
using namespace System::Collections::Generic;

public ref class MyClass
{
private:
    //std::vector<std::string> ints; // Native C++ types can not be members of Managed class
    List<String^>^ ints; // Managed types can be class members
    std::vector<std::string>* native_ints; // However You can have pointer to native type as class member

public:
    MyClass()
    { // Initialize lists with some values
        ints = gcnew List<String^>(gcnew array<System::String^>{ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }); // Managed initialization
        native_ints = new std::vector<std::string>{ "a", "b", "c" }; // Native initialization
    }

    ~MyClass()
    {
        delete native_ints; // Native (not Managed) memory allocation have to be deleted
    }

    void Print()
    {
        Console::WriteLine("Managed List: {0}", String::Join(", ", ints->ToArray()));
        std::cout << "Native vector: " << (*native_ints)[0] << ", " << (*native_ints)[1] << ", " << (*native_ints)[2];
    }
};


int main(array<System::String ^> ^args)
{
    MyClass^ mc = gcnew MyClass();
    mc->Print();

    return 0;
}

И вывод консоли:

Managed List: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Native vector: a, b, c

Типы эквивалентов:

И не забудьте про ^ для управляемых типов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...