2016-09-24 3 views
0

Ich verwende derzeit VS2015 für diese.Objekt wird nicht ordnungsgemäß instanziiert

Ich versuche, einen binären Suchbaum in C++ zu erstellen, so dass ich sowohl die Sprache als auch die Datenstruktur lernen kann, während ich versuche zu sehen, ob ich guten Praktiken folgen kann. Ich komme jedoch durch ein Problem, bei dem ich das Objekt nicht korrekt in der Treiberdatei instanziiere.

BSTHeader.h

#pragma once 

/* 
    Properties of Binary Search Tree: 

    1.) Elements less than root will go to the left child of root 
    2.) Elements greater than root will go to the right child of root 
*/ 

#include <memory> 

// Binary Search Tree handler class 
class BSTHeader { 

    /* 
     Naive implementation of BSTNode (non-generic version) 

     Nested class is private, but it's internal fields and member functions 
     are public to outer class: BSTHeader 
    */ 
    class BSTNode { 
    public: 
     int data; 
     std::unique_ptr<BSTNode> left; 
     std::unique_ptr<BSTNode> right; 

     BSTNode(int val) { 
      data = val; 
      left = NULL; 
      right = NULL; 
     } 
     ~BSTNode() {} 
    }; 

    std::unique_ptr<BSTNode> root;   // Root of BST 
    unsigned int size;      // Total amount of nodes in tree from root 


public: 
    BSTHeader(); 
    BSTHeader(int val); 
    ~BSTHeader(); 
    bool insert(std::unique_ptr<BSTNode>& root, int val); 
} 

BSTHeader.cpp

#include "BSTHeader.h" 


/* 
    Constructors: 
*/ 
BSTHeader::BSTHeader() { 
    root = NULL; 
    size = 0; 
} 

BSTHeader::BSTHeader(int val) { 
    root = std::unique_ptr<BSTNode>(new BSTHeader::BSTNode(val));  // Smart pointer to an internal BSTNode 
    size = 1; 
} 

BSTHeader::~BSTHeader() {}            // Empty destructor from use of smart pointer 

/* 
    Member functions: 
*/ 
bool BSTHeader::insert(std::unique_ptr<BSTNode>& root, int val) { 
    if (root == NULL) {             // Place new element here 
     root = std::unique_ptr<BSTNode>(new BSTHeader::BSTNode(val)); 
     size++; 
     return true; 
    } 

    if (val < root.get()->data) {          // val < root 
     insert(root.get()->left, val); 
    } 

    else if (val > root.get()->data) {         // val > root 
     insert(root.get()->right, val); 
    } 

Die Frage, die ich bekommen, ist hier, wo ich glaube, ich versuche, ein BSTHeader Objekt zu instanziiert.

Program.cpp

#include "BSTHeader.h" 

int main() 
{ 
    BSTHeader::BSTHeader bst(); // <----- ERROR 
    return 0; 
} 

Der Fehler, den ich bekommen habe ist cannot determine which instance of overloaded function "BSTHeader:BSTHeader" is intended

Jedes Mal, wenn ich tun: BSTHeader bst() Ich bin nicht in der Lage, die insert(..., ...) Funktion für das Objekt zuzugreifen bst.insert(..., ...) tun wegen expression must have class type obwohl der obige Fehler nicht angezeigt wird.

Aber alles funktioniert gut und ich bin in der Lage, auf alle Mitglied Methoden zugreifen, indem Sie dies tun: BSTHeader bst(5) mit dem überladenen Konstruktor.

Ich bin nicht sicher, ob es ein Namespace-Problem ist oder nicht. Ich habe das Gefühl, dass mir etwas fehlt.

+1

Ihre Fehlerzeile ist der _Most Vexing Parse_. Es sieht wie ein Funktionsprototyp aus, also so wird es interpretiert. Entferne das '()'. – 1201ProgramAlarm

+0

Das hat es behoben, aber bedeutet das, dass ich niemals a() für den Zugriff auf den Standardkonstruktor verwenden sollte? – Naz

+0

@Naz Ja. Sie können stattdessen '{}' verwenden, wenn Sie möchten. aber Sie sollten es wahrscheinlich einfach weglassen. –

Antwort

0

Die Linie

BSTHeader::BSTHeader bst(); // <----- ERROR 

ist eine Deklaration einer Funktion namens bst, die keine Argumente und gibt einen BSTHeader::BSTHeader nimmt.

Dies ist bekannt als die "ärgerlichsten parse", und oft in weniger höflichen Sprache beschrieben.

Wenn Sie eine Instanz instanziieren möchten und dem Konstruktor keine Argumente geben möchten, entfernen Sie die ().

Verwandte Themen