Einen vector in einer Klasse definieren
-
Hallo Forum,
ich lerne gerade C++ mit VC++ und Windows-Forms. Nun mein Problem:
In einer Form1.h habe ich nach der Klassen-Definition ein 'std::vector<int> vData = {}' eingefügt. Dabei wird der Name als Fehler markiert und der Fehler lautet: "Ein Member einer verwalteten Klasse kann kein nicht verwalteter Klassentyp sein". Was mache ich da Falsch? Hier der Code-Ausschnitt:#pragma once #include <vector> #include "H_ArraySearch.h" #include "Header1.h" #include "Header2.h" namespace CppCLRWinFormsProject { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Summary for Form1 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: protected: **std::vector<int> vData;** Form1(void) { InitializeComponent(); // //TODO: Add the constructor code here // // uncomment to execute the rk1-utils: // N_rk1_Utils_demo::execute(); // shows how the rk1-utils can be used }
-
Du musst schon die .Net klassen nutzen innerhalb einer ref class.
-
@firefly sagte in Einen vector in einer Klasse definieren:
Du musst schon die .Net klassen nutzen innerhalb einer ref class.
Danke für die schnelle Antwort. Mit .Net Klassen in diesen Fall verstehe ich nicht. Wenn ich die vector-Anweisung in einer folgenden Funktion definiere funktioniert sie aber. Da ich den vector aber in allen Funktionen brauch möchte ich ihn als Klassen-Variable definieren. Ist das mit .Net vieleicht so wie System::Windows::Forms::TextBox^ out_textBox; ?
-
@znieh99 sagte in Einen vector in einer Klasse definieren:
ich lerne gerade C++ mit VC++ und Windows-Forms.
Du lernst hierbei aber kein C++ sondern C++/CLI, einer Sprache für die .NET Platform. Leider sorgt dies für Verwirrung da sich C++ zu C++/CLI verhält, wie ein Kind zu einem Kinderschnitzel.
Eine Empfehlung: Wenn du mit dem .NET Framework arbeiten möchtest, dann nutze C#. Wenn nicht, dann nutze C++.
-
@Quiche-Lorraine sagte in Einen vector in einer Klasse definieren:
Du lernst hierbei aber kein C++ sondern C++/CLI, einer Sprache für die .NET Platform.
Das ist sicher gut gemeint aber hilft mir nicht weiter.
-
Was @firefly schon sagte: Du kannst
std::vector
nicht in managed code benutzen, weil managed code seine eigenen Regeln zur Speicherverwaltung benutzt, die nicht mit dem C++ Standard kompatibel ist. Du musst einen managed Container benutzen, zb.List<T>
oder sowas (iwas aus der C# Library, keinen C++ STL Container), kenn' mich mit C# nicht allzu gut aus.Ansonsten kann ich @Quiche-Lorraine nur beipflichten, du betrittst die Welt der Schmerzen, weil du ständig Brücken zwischen zwei Welten schlagen musst. Allein aus diesem Hinweis kann man schon soviel lernen, dass man solche Experimente besser sein lässt.
-
@znieh99 sagte in Einen vector in einer Klasse definieren:
"Ein Member einer verwalteten Klasse kann kein nicht verwalteter Klassentyp sein"
Also, das ist kryptischer Murks... wunder mich bei M$ aber kaum.
Auf Deutsch steht da: Entweder es ist Mitglied einer verwalteten Klasse oder nicht.
-
Man kann
std::vector
schon nutzen, aber halt als "unmanaged resource". Also konkret, wenn ich mich richtig erinnere, kann man einfach Zeiger auf Zeugs wiestd::vector
machen. Also manuellnew
in ctor +delete
im "destruktor" (finalizer).
-
@hustbaer Danke, das versuche ich!
-
@znieh99
Also wenn du unbedingt C++/CLI nutzen möchtest, dann würde ich dir die folgenden MSDN Ressourcen empfehlen:https://learn.microsoft.com/en-us/cpp/dotnet/vector-stl-clr?view=msvc-170
https://learn.microsoft.com/en-us/cpp/dotnet/stl-clr-library-reference?view=msvc-170To use STL/CLR:
Include headers from the cliext include subdirectory instead of the usual C++ Standard Library equivalents.
Qualify library names with cliext:: instead of std::.
-
@Quiche-Lorraine Danke!
-
@znieh99 sagte in Einen vector in einer Klasse definieren:
@Quiche-Lorraine Danke!
Dann sei dir aber im klaren, dass du damit kein C++ lernst sondern C++/CLI was nicht das selbe ist!
-
@firefly sagte in Einen vector in einer Klasse definieren:
Dann sei dir aber im klaren, dass du damit kein C++ lernst sondern C++/CLI was nicht das selbe ist!
Nun, das habt ihr mir ja sehr deutlich klar gemacht. Danke!
-
firefly schrieb:
Dann sei dir aber im klaren, dass du damit kein C++ lernst sondern C++/CLI was nicht das selbe ist!
Und je länger du mit C++/CLI arbeitest, desto mehr wird dir das auf die Füße fallen.
Alleine bei der Const Correctness gibt es größere Unterschiede:
literal
(C++/CLI) <->const
,readonly
(C#) <->const
,static const
,constexpr
,static constexpr
,constval
(C++)
-
@Quiche-Lorraine sagte in Einen vector in einer Klasse definieren:
Und je länger du mit C++/CLI arbeitest, desto mehr wird dir das auf die Füße fallen.
Ist ja gut. Ich werde mich auch mit C# auseinander setzen aber erst möchte ich mal die Aufgaben aus meinem Buch über C++ fertig machen.
-
@znieh99 sagte in Einen vector in einer Klasse definieren:
Ist ja gut. Ich werde mich auch mit C# auseinander setzen aber erst möchte ich mal die Aufgaben aus meinem Buch über C++ fertig machen.
?
Wir versuchen dir gerade klarzumachen, dass C++/CLI nicht C++ ist und du antwortest, dass du erstmal die C++ Aufgaben aus deinem C++ Buch lösen möchtest, dass C++/CLI Aufgaben stellt? Irgendwas passt hier nicht zusammen. Wie heißt denn das Buch?
-
@DocShoe C++ mit Visual Studio 2022 und Windows Forms- Anwendungen von Richard Kaiser
-
@znieh99 sagte in Einen vector in einer Klasse definieren:
C++ mit Visual Studio 2022 und Windows Forms- Anwendungen von Richard Kaiser
Jo und da haben wir den Mist.
Da ich immer mal wieder gefragt werde, ob und wie man C++ in Verbindung mit C#, .NET Framework und .NET verwenden kann, hier eine kurze Einführung.
Quelle: https://link.springer.com/book/10.1007/978-3-662-65257-2
Das Buch ist per se sehr unglücklich. Erst eine Einführung in C++17 und dann kommt ein Spruch der Form "C++ in Verbindung mit C#, .NET Framework und .NET verwenden".
Ich frage mich wohl wie der folgende Code in C++/CLI aussieht:
#include <string> constexpr bool EvenLen(std::string_view s) { return (s.length() % 2 != 0); } int main(int argc, char* argv[]) { static_assert(EvenLen("Hallo Welt"), "String muss eine gerade Laenge aufweisen!"); static_assert(EvenLen("Hallo Welt2"), "String muss eine gerade Laenge aufweisen!"); }
Der Code muss man unter Visual Studio 2019 gar nicht kompilieren. Nachdem man den Code gespeichert hat, zeigt die IDE automatisch bei der ersten
static_assert
Anweisung einen Kringel an. Geht man mit dem Mauscursor drüber, so erscheint die Meldung "String muss eine gerade Laenge aufweisen!".Spiele ruhig mal damit rum! Verändere die Länge des Strings!