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.
Ihre Fehlerzeile ist der _Most Vexing Parse_. Es sieht wie ein Funktionsprototyp aus, also so wird es interpretiert. Entferne das '()'. – 1201ProgramAlarm
Das hat es behoben, aber bedeutet das, dass ich niemals a() für den Zugriff auf den Standardkonstruktor verwenden sollte? – Naz
@Naz Ja. Sie können stattdessen '{}' verwenden, wenn Sie möchten. aber Sie sollten es wahrscheinlich einfach weglassen. –