2016-09-24 98 views
0

我目前正在使用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)

我不確定是否它的名稱空間問題。我感覺好像我失去了一些東西。

+1

您的錯誤行是_Most Vexing Parse_。它看起來像一個函數原型,所以這就是它的理解。刪除'()'。 – 1201ProgramAlarm

+0

修復了它,但這是否意味着我不應該包含訪問默認構造函數的()? – Naz

+0

@Naz Yep。如果你願意,你可以使用'{}'。但你應該放棄它。 –

回答

0

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

是一個名爲bst功能,它沒有任何參數,並返回BSTHeader::BSTHeader的聲明。

這被稱爲「最令人頭痛的解析」,並且通常用較不禮貌的語言描述。

如果您想實例化一個實例,給構造函數沒有參數,請刪除()