Problem beim Überladen vom = Operator
-
Ich habe ein kleines Problem beim überladen vom = Operator.
Ich habe ein GUI und eine Klasse (SerialPortProperties). Im GUI will ich eine Instanz von SerialPortProperties anlegen um mir die Informationen der Verbindung zu holen.
Form1.h :
public ref class Form1 : public System::Windows::Forms::Form
{
public: SerialPortProperties prop;Form1()
{
prop=gcnew SerialPortProperties;
InitializeComponent();
}
... //Der Rest vom GUI
};Edit2: besser lesbarer Code
SerialPortProperties.h :#ifndef SERIALPORTPROPERTIES_H
#define SERIALPORTPROPERTIES_H#using <System.dll>
using namespace System;
using namespace System::IO::Ports;
using namespace System::Threading;public ref class SerialPortProperties
{
private:
static SerialPort^ _serialPort=gcnew SerialPort;public:
SerialPortProperties();void SetPortName(String^ portName);
String^ GetPortName();
void SetPortBaudRate(Int32 BaudRate);
Int32 GetPortBaudRate();
void SetPortParity(Parity PortParity);
Parity GetPortParity();
void SetPortDataBits(Int32 DataBits);
Int32 GetPortDataBits();
void SetPortStopBits(StopBits defaultPortStopBits);
StopBits GetPortStopBits();
void SetPortHandshake(Handshake handshake);
Handshake GetPortHandshake();//SerialPortProperties operator=(SerialPortProperties spp);
};
#endif
SerialPortProperties.cpp :
#include "stdafx.h"
SerialPortProperties::SerialPortProperties()
{
SetPortName(_serialPort->PortName);
SetPortBaudRate(_serialPort->BaudRate);
SetPortParity(_serialPort->Parity);
SetPortDataBits(_serialPort->DataBits);
SetPortStopBits(_serialPort->StopBits);
SetPortHandshake(_serialPort->Handshake);_serialPort->Open();
...
_serialPort->Close();
}... //Set und Get Funktion aus der .h
SerialPortProperties SerialPortProperties::operator=(SerialPortProperties const spp)
{
_serialPort->SetPortName(spp->GetPortName());
_serialPort->SetPortBaudRate(spp->GetPortBaudRate());
_serialPort->SetPortParity(spp->GetPortParity());
_serialPort->SetPortDataBits(spp->GetPortDataBits());
_serialPort->SetPortStopBits(spp->GetPortStopBits());
_serialPort->SetPortHandshake(spp->GetPortHandshake());return this;
}Ich bekomme folgende Fehlermeldung:
error C2679: Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operanden vom Typ 'SerialPortProperties ^' akzeptiert (oder keine geeignete Konvertierung möglich)
c:\documents...\Form1.h
Zeile 30Zeile 30 = prop=gcnew SerialPortProperties;
Ich habe schon alles Mögliche versucht beim Überladen vom = Operator (&,*, ohne const, SerialPortProperties^ übergeben,...) und finde keine Antwort um das Problem zu beheben. Ich habe meine Unterlagen aus der Schule zur Hilfe genommen und ein paar Foren nach dem Problem durchsucht, aber nichts passendes gefunden.
Edit: Ich benutze Visual Studio 2010
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C++/CLI mit .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Warum glaubst du, den =-Operator überschreiben zu müssen?
An dem Design finde ich ansonsten einiges merkwürdig:
-
Die Klasse hat keine Daten, sondern nur ein statisches Element. Alle Instanzen der Klasse bearbeiten nur dieses. Und trotzdem willst du bei Zuweisungen und Konstruktionen dessen Eigenschaften abfragen und wieder setzen?
-
Deine Setter geben Werte zurück. Das ist einigermaßen ungewöhnlich. Statt einer Zeile wie
_serialPort->PortName = SetPortName(_serialPort->PortName);
würde ich
SetPortName(_serialPort->PortName);
erwarten (mal abgesehen von Punkt 1.)
Ob das wirklich WTFs sind kann ich mangels Einsicht in die Implementation nicht abschließend beurteilen, aber das sind so Sachen, die wohl jedem beim Lesen sofort auffallen würden.
-
-
Wenn ich den = Operator nicht überlade kommt folgende Fehlermeldung:
error C2582: Die Funktion 'operator =' ist in 'SerialPortProperties' nicht verfügbar
c:\...\Form1.h
Zeile 30Ich weiß, das ich am Design noch viel arbeit habe. Ich mache zum ersten Mal so ein Beispiel und hole mir alles was nützlich ist aus dem Internet, weil wir in der Schule nichts mit seriellen Schnittstellen programmiert haben.
Ich will das Beispiel irgendwie zum laufen bringen und wenns funktioniert werde ich den Code säubern
Edit: Ich habe mich an dieses Bsp gehalten
http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1Habe jetzt den Code für die SerialPortProperties gesäubert und werde den neuen Code oben reinschreiben und dan werde weiter nach einer Lösung für mein Problem suchen
-
Ok ich seh schon. Dein prop ist ein Objekt, kein Handle. Du versuchst dem Objekt ein Handle zuzuweisen, das ist aber Unsinn. Das ist auch nicht notwendig, das Objekt existiert ja schon. gcnew brauchst du nur, wenn du ein Handle hast und das mit einem neuen Objekt belegen möchtest.
Du hast in C++/CLI zwei Möglichkeiten, mit gemanagten Objekten umzugehen:
Erstens: Als Handle.
SerialProperties^ prop = gcnew SerialProperties; ... delete prop; // nicht notwendig, wenn SerialProperties nicht disposable ist
Eine Klasse ist disposable, wenn sie das Interface IDisposable implementiert, bzw. in C++/CLI einen Destruktor (~SerialProperties()) besitzt, oder wenn mindestens eines ihrer Memberobjekte disposable ist.
Bei dem Namen "SerialProperties" würde ich von einer reinen Datenklasse ausgehen, also nicht disposable. Deine Klasse spiegelt diese Bedeutung aber nicht wirklich wieder, auch wegen diesem komischen static-Objekt, deshalb kann ich dir da nichts raten.
Zweitens: Als Objekt (das das eine "ref class" ist, ist das intern auch nur ein Handle, aber mit Objekt-Syntax)
SerialProperties prop; // kein gcnew, kein delete, Objekt wird am Ende seines Scopes automatisch deletet
Bei dir sähe das so aus:
public ref class Form1 : public System::Windows::Forms::Form { public: SerialPortProperties^ prop; Form1() : prop(gcnew SerialProperties) {
oder
public ref class Form1 : public System::Windows::Forms::Form { public: SerialPortProperties prop; Form1() { // Keine Initialisierung notwendig
BTW hast du Erfahrung in einer anderen Programmiersprache? Falls nein, möchte ich dir davon abraten, mit C++/CLI weiterzumachen. Diese Sprache kann man eigentlich nur sinnvoll einsetzen, wenn man einerseits C++ halbwegs kann und andererseits auch die .NET-Konzepte, idealerweise aus C#, kennt. Ansonsten ergibt vieles nicht so richtig Sinn.
-
Danke für die Informationen Ich werde sie gleich in meinen Code einbauen.
In der Schule habe ca 2,5 Jahre C++ gelernt und jetzt machen wir java (ca 1,5 Jahre). Seitdem wir java machen, habe ich nichts mehr in C++ gemacht (außer ganz am Anfang bei java wo wir die Unterschiede besprochen hatten).
Jetzt beim Praktikum muss ich dieses Programm in C++ schreiben und das fällt mir nach so einer langen Zeit ohne C++ schon schwerEdit: Nochmal ein riesiges Dankeschön, jetzt funktioniert wieder alles was ich programmiert habe und kann endlich weiter machen
-
C++OrJavaThatsTheQuestion schrieb:
Jetzt beim Praktikum muss ich dieses Programm in C++ schreiben und das fällt mir nach so einer langen Zeit ohne C++ schon schwer
Das ist aber kein C++ sondern C++/CLI was Du da programmierst. Ich kann Dir auch nur davon abraten und stattdessen reines C++ mit einem guten GUI-Framework zu verwenden.