Kann keine Objekte aus der Klasse erstellen

  • Themenstarter Themenstarter blong1550
  • Beginndatum Beginndatum
B

blong1550

Hallo,
ich habe folgendes Programm:

Code:
#include <iostream>
#include <string>
using namespace std;

/**
 * Eine Node eines sortierten Binärbaumes.
 *
 */
class TreeNode {

  private:

    string word; // der Wert der Node

    // Vater Element.
    // NULL wenn diese Node die Root-Node ist.
    TreeNode* parent;

    // linkes und rechtes Kind.
    TreeNode* left;
    TreeNode* right;

  public:

    // Konstruktor. Default Werte werden gesetzt.
    TreeNode(string word);
    void insert(string word);

};

TreeNode::TreeNode(string word) // Konstruktor
{
    this->word = word;
    this->parent = NULL;
    this->left = NULL;
    this->right = NULL;
}

void TreeNode::insert(string word)
{

}


int main(void) {
	// Baum erstellen und mit Werten füllen

TreeNode n1;
	n1.insert("Mike");
/*	n2.insert("Moe");
	n3.insert("Olaf");
	n4.insert("Barb");
	n5.insert("Anne");
	n6.insert("Chris");
	n7.insert("Jenny");
	n8.insert("Sven"); */

}

Ich verstehe nicht was mir der Compiler mit folgender Meldung sagen will:
no matching function for call to `TreeNode::TreeNode()'

Marktiert wird die Zeile:
TreeNode n1;


Ich sehe nicht was ich bisher falsch gemacht habe.



Freue mich auf eure Anworten

Grüße
 
Der Konstruktor erwartet bei dir hier einen Parameter
Du musst auch einen zweiten Konstruktor erstellen, der ohne Parameter zurechtkommt
(oder du änderst die markierte Zeile entprechend)
 
mh ok, ich verstehe zwar nicht wieso ich zwei Konstruktoren brauche, aber es funktioniert.

Legt der Konstruktor die Wurzel fest, bzw benennt sie auch?
 
Bei deinem Programm erstellst du mit n1 ja eine Wurzel.

Den zweiten Konstruktor brauchst du wegen deiner Instanzierungsweise, zB
wenn du schreibst
Treenode n1("Gustav");
wird dein erster Konstruktor verwendet und bekommt Gustav als String übergeben
Du gibst aber keinen String an, jetzt will der Compiler halt wissen, was in in dem Fall machen soll.
Dafür der zweite, der legt fest, was ohne String passieren soll.
 
ah super jetzt versteh ich das :) Danke!

Hab aber noch eine Frage. Jedes Objekt hat ja einen parent, left, right.

Diese muss ich ja irgendwie bei aufruf von Insert festlegen.
Nur wie programmiere ich das, dass die Zeiger immer auf die richtigen Knoten zeigen?
Also wenn ich n2 habe, soll der "parent" ja n1 sein. und left und right n4 und n5.

Brauche ich da Methoden set und get left,right,parent ?
 
Hallo blong1550,

Du könntest z.B. Deine Funktionen überlagern, sowie Du es bereits für den Konstruktor getan hast:
Code:
void insert(string word);
void insert( string word, TreeNode *parent, TreeNode *left, usw.);
Somit könntest Du die Methode auch zum Setzen der anderen Member benutzen.
Neben der Überlagerung von Funktionen kann man die zu übergebenen Parameter auch mit Standardwerten vorbelegen, sodass wenn nur ein String angegeben wird, der Rest mit Standardwerten initialisiert wird:
Code:
void insert( string word, TreeNode *parent = NULL, TreeNode *left = NULL, usw. );
Hierbei werden dann, sofern nur ein String mitgegeben wird, alle Zeiger auf NULL (nicht die Zahl 0!) gesetzt und zeigen somit nirgendwo hin.
Genauso könnte dann auch einer der Konstruktoren aussehen, damit die Funktion nicht separat aufgerufen werden muss (aber kann).
Um an diese Werte wieder heran zu kommen, musst Du dann auch eine Methode getParent usw. schreiben, also ja: weitere Methoden benötigt.

Allerdings solltest Du Dich vorher mal genauer über Zeiger und Referenzvariablen informieren, ist nicht ganz ohne. Beim Zugriff auf z.B. einen Zeiger, der nirgendwo hin zeigt, bringt Dein Programm zum Absturz und kann noch viel schlimmeres anrichten!
Des Weiteren ist das Überlagern von Funktionen sicher auch mal einen Blick wert ...

MfG
TheBadDwarf
 
Zurück