我目前正在使用VS2015。對象沒有正確實例化
我想在C++中創建一個二叉搜索樹,這樣我就可以學習語言和數據結構,同時試圖查看我是否可以遵循良好的做法。但是,我遇到了一個問題,我沒有正確地在驅動程序文件中正確實例化對象。
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);
}
我得到的問題就在這裏,在這裏我相信我試圖實例化一個BSTHeader對象。
Program.cpp
#include "BSTHeader.h"
int main()
{
BSTHeader::BSTHeader bst(); // <----- ERROR
return 0;
}
我得到的錯誤是cannot determine which instance of overloaded function "BSTHeader:BSTHeader" is intended
但是,每當我做的: BSTHeader bst()
我無法訪問insert(..., ...)
功能做bst.insert(..., ...)
由於對象expression must have class type
即使上述錯誤未出現。
然而,一切正常,我可以通過使用重載的構造函數來訪問所有成員方法:BSTHeader bst(5)
。
我不確定是否它的名稱空間問題。我感覺好像我失去了一些東西。
您的錯誤行是_Most Vexing Parse_。它看起來像一個函數原型,所以這就是它的理解。刪除'()'。 – 1201ProgramAlarm
修復了它,但這是否意味着我不應該包含訪問默認構造函數的()? – Naz
@Naz Yep。如果你願意,你可以使用'{}'。但你應該放棄它。 –