www.mikrocontroller.net

Forum: PC-Programmierung Verwendung eines Konstruktors


Autor: Gernot (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für ein Projekt von mir versuche ich jetzt mit Klassen zu arbeiten. Beim 
erstellen eines Objekts sind aber ein Fehler aufgetreten mit denen ich 
nicht gerechnet habe, und ich hoffe ihr könnt mir da weiter helfen.

Wenn ich keinen eigenen Konstruktor habe werden die Variablen der Klasse 
nicht initialisiert (ich dachte das die dann standardmäßig mit 0 
initialisiert werden.)
Beim selber schreiben bin ich mir aber nicht sicher wie ich ihn 
defnieren muss. Mom hab ich das ganze so gemacht:
class Name
{
  char var1;
  float var2;

  Name(int a);

  public:
    
    //Methoden
};
Bin mir eigentlich recht sicher das das so funktionieren sollte. Wenn 
ich dann aber ein Objekt erstelle bekomme ich die Fehlermeldung: no 
matching function to call Name::Name.
Muss ich den Konstruktor in der main() extra aufrufen? Wenn ja wie?

Hoffe ihr könnt mir da weiterhelfen,

mfg
Gernot

Autor: Sascha Bader (sbader)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Deiner Klasse fehlt noch der Default Konstruktor in der Form

Name :: Name ()
{
  // hier alles initialisieren
  var1=' ';
  var2=0.0;
  // ...
}

Diesen müßtest Du nicht explizit aufrufen.

Im Beispiel oben hast Du noch einen Konstruktur Name(int a) deklariert. 
Damit Du ihn benutzen kannst muss er auch definiert werden in der Form

Name :: Name(int a)
{
   // hier was mit a machen?
}

Um diesen Konstruktor zu verwenden, mußt Du z.B. in main() sowas 
schreiben

Name a = new Name(123);

Autor: Martin Cibulski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gernot,

der Konstruktor in Deinem Code braucht einen Parameter a.
Dann muss die Variable auch angelegt werden mit z.B.

Name N = Name(5); (oder so ähnlich)

Wenn im Code nur die Variable ohne Parameter a angelegt wird,
(also nur: Name N;), dann braucht man einen Standard-Konstruktor
ohne Parameter.

class Name
{
  char var1;
  float var2;

  Name();  // Standard-Konstruktor

  public:

    //Methoden
};

Der Compiler sucht immer den passenden Funktionsaufruf mit
genau den passenden Parametern und kann diesen wohl nicht finden.

Gruß,
Martin

Autor: Sascha Bader (sbader)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, der Konstruktor sollte normalerweise auch hinter dem "public:" 
stehen, sonst kannst Du aus main heraus nicht drauf zugreifen.
Hier mal ein lauffähiges Beispiel + Bildschirmausgabe:

Default Konstruktor var1=
int Konstruktor a=1
int Konstruktor a=2


#include <cstdlib>
#include <iostream>

using namespace std;

class Name
{
  char var1;
  float var2;
  int x;

  public:

  Name();
  Name(int a);
    //Methoden
};

Name::Name()
{
   cout << "Default Konstruktor var1=" << var1 << endl;
}


Name :: Name (int a)
{
   x=a;
   cout << "int Konstruktor a=" << a << endl;
}


int main(int argc, char *argv[])
{
    Name x;
    Name x2(1);

    Name* x3 = new Name(2);

    system("PAUSE");
    return EXIT_SUCCESS;
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich keinen eigenen Konstruktor habe werden die Variablen der
> Klasse nicht initialisiert (ich dachte das die dann standardmäßig mit 0
> initialisiert werden.)

Member-Variablen von eingebauten Typen (wie z.B int oder float) bleiben 
uninitialisiert. Bei Klassen wird der Default-Kontruktor aufgerufen.

>  Name(int a);
>
> Bin mir eigentlich recht sicher das das so funktionieren sollte. Wenn
> ich dann aber ein Objekt erstelle bekomme ich die Fehlermeldung: no
> matching function to call Name::Name.

Du hast einen Konstruktor definiert, der einen Wert als Parameter 
erwartet. Dann mußt du bei der Erzeugung des Objekts diesen Parameter 
aber auch angeben.

> Muss ich den Konstruktor in der main() extra aufrufen? Wenn ja wie?

Der wird beim Erzeugen eines Objekts immer automatisch aufgerufen. Du 
kannst z.B. ein Objekt "name" erzeugen mit:  Name name(5);

@Sascha Bader:

> Name :: Name ()
> {
>  // hier alles initialisieren

Eigentlich nicht. Hier sind alle Initialisierungen - sofern überhaupt 
welche stattfinden - schon abgelaufen. Was folgt, sind Zuweisungen.

>   var1=' ';
>   var2=0.0;
>   // ...
> }

Eine echte Initialisierung würde so aussehen:

Name :: Name ()
  : var1(' '),
    var2(0.0)
{
   // ...
}

> Um diesen Konstruktor zu verwenden, mußt Du z.B. in main() sowas
> schreiben
>
> Name a = new Name(123);

new gibt einen Zeiger zurück, also müßte es heißen:
Name* a = new Name(123);

Aber dynamisch angelegte Objekte sollte man nur verwenden, wenn man sie 
auch wirklich braucht. Wenn man nicht gerade eine "smart-pointer"-Klasse 
verwendet, muß man nämlich sonst jedes von diesen Objekten auch wieder 
manuell freigeben.

Autor: Sascha Bader (sbader)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rolf

>Eigentlich nicht. Hier sind alle Initialisierungen - sofern überhaupt
>welche stattfinden - schon abgelaufen. Was folgt, sind Zuweisungen.
>Eine echte Initialisierung würde so aussehen:

Da hast Du natürlich Recht. Initialisierunglisten sind hier die bessere 
Wahl.  Ist schon besser wenn man von Anfang an den richtigen Stil 
vermittelt.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.