0 Daumen
6k Aufrufe

ich habe eine Frage:

Sachverhalt:

ich habe eine Klasse ExampleClass mit folgendem Kosntruktor

ExampleClass::ExampleClass(Objekt objekt): var(objekt){...do things...}
Der Konstruktor wird aufgerufen und ein Objekt übergeben, welches in einer Klasse-Variable(auch vom Typ Objekt) geschrieben wird.

in der main:

int main(int argc, char** argv) {
...
Objekt objekt(argv[1]);
ExampleClass class(objekt);
...
return 0;
}
Das Objekt "objekt" benötigt einen String den man beim Start des Programmes eingibt.

header ExampleClass

class ExampleClass {
public:
ExampleClass(Objekt objekt);
...
private:
Objekt var;
...
};

Beim kompilieren kommt folgender Fehler:

use of deleted function ‘Objekt::Objekt(const Objekt&)’


Ich kann den Fehler irgendwie nicht ganz deuten, kann mir da jemand weiter helfen?

Oder muss ich mit Pointern arbeiten ? In der Regel progge ich mit Java, wenn überhaupt, daher bin ich mit Pointern nicht so vertraut.

Das Ziel ist einfach, das Objekt der Klasse übergeben, sodass ich in der Klasse mit dem Objekt arbeiten kann.

Worst Case könnte das Objekt auch in der Klasse ExampleClass im Konstrukter erzeugt werden, muss aber dann für die ganze Klasse zur verfügung stehen und beim erzeugen den String erhalten.

Avatar von

wenn ich bei dem Objekt jeweils noch eine "()" schreibe

z.B.

ExampleClass::ExampleClass(Objekt objekt()): var(objekt()){...do things...}
-------------------
class ExampleClass {
public:
ExampleClass(Objekt objekt());
Dann kommt folgender Fehler in der Main beim Aufruf der Klasse ExampleClass und der Fehler im Konstruktor-Kopf is weg.

ExampleClass’ was not declared in this scope


*der Fehler aus dem ersten Post stand bei dem Konstruktor-Kopf der ExampleClass

Oder muss ich mit Pointern arbeiten ?
Ja.

Nein - das gilt es eher zu vermeiden.


@André: BTW wie gibt man hier den Code direkt ein? Funktioniert bei mir nur, wenn ich den Code 'im Block' kopiere. Gebe ich den Code direkt ein, so passiert das:


class Object

{

public:

    Objekt( Objekt&& objekt );

Habs gelöst:

Arbeite mit Referenzen


ExampleClass::ExampleClass(Objekt & objekt): var(objekt){...do things...}

class ExampleClass {
public:
ExampleClass(Objekt & objekt);
...
private:
Objekt & var;
...
};

Vom Duplikat:

Titel: One Definition Rule / Objekt als Klassenvariable erstellen (c++)

Stichworte: cpp,informatik

Hi,

ich hatte folgendes Problem (https://www.stacklounge.de/2513/objekt-einer-klasse-ubergeben-c) Es hat ansich alles Funktioniert, jedoch kommt als neues Problem hinzu, dass ich so das "One Definition Rule" Konzept nicht einhalten kann. ( https://en.wikipedia.org/wiki/One_Definition_Rule)

Also such ich einen andern Weg und zwar:

Wie kann ich in einer angelegten Klasse ein Objekt deklarieren und initialisieren, sodass es für die ganze Klasse zur Verfügung steht. Das Objekt wurde bis jetzt in der Main so angelegt:

Objekt objekt(argv[1]);
Das Objekt hat ein "char" als Übergabeparameter. Wenn ich jetzt aber in der Klasse das Objekt im Header unter "private: " anlege, wie in dem Schnipsel beschrieben, funktionert das nicht. Dann wird die Variable als Funktion gehighlightet.

Bis jetz habe ich immer nur Objekte als Klassenvariable angelegt, die einen Default Konstruktor haben, sprich ohne Klammer. Wie mach ich das in diesem Fall?

Hoffe ich hab das Problem verständlich erklärt.


selbst gelöst. Also hat sich die Frage erübrigt

1 Antwort

0 Daumen

Hallo SiNuss,

wenn Du ein '()' hinter den Parameter-Namen hängst, so ist das für den Compiler eine Funktion namens 'objekt' die ein Objekt vom Typ 'Objekt' zurück liefert. Das ist nicht das, was Du willst.

Beim kompilieren kommt folgender Fehler:
use of deleted function ‘Objekt::Objekt(const Objekt&)’

Dann wird im Header objekt.h wahrscheinlich stehen: 

class Objekt {
public:
    Objekt( const Objekt& ) = delete;

Dann solltest Du mal nachsehen, warum das so ist. I.A. hat das einen Grund. Eine Alternative ist der move-Konstruktor:

class ExampleClass {
public:
ExampleClass(Objekt&& objekt);

und

ExampleClass::ExampleClass(Objekt&& objekt): var(std::move(objekt)){...do things...}

und der Aufruf wäre:

Objekt objekt(argv[1]);
ExampleClass class( std::move(objekt) );

aber Achtung, danach ist die variable 'objekt' nicht mehr zu gebrauchen!
oder gleich

ExampleClass class( Objekt(argv[1]) );

Das obige setzt natürlich voraus, dass ein move-Konstruktor in objekt.h existiert.

PS.: Verwende keine Key-Words (z.B. 'class') als Variablennamen.

Avatar von

ups deine Antwort übersehen.


Ja das hier ist nur Beispielhaft, Keywords benutze ich nicht dafür.

hab meinen Weg in dem Kommentar zum Post oben drüber gepostet

Arbeite mit Referenzen

Das geht auch. Und ist ok, solange das aufrufende Programm so aussieht:

...
Objekt objekt(argv[1]);
ExampleClass class(objekt);

denn dann ist garantiert, dass 'objekt' immer existiert, solange 'class' existiert. Da beide in dieser Reihenfolge auf dem lokalen Stack liegen.

Für eine allgemeine Anwendung ist das riskant, da man auch ein Objekt vom Typ 'Objekt' auf dem Heap anlegen und dort vor Ende der Lebenszeit von 'class' löschen könnte.

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community