#ifndef 不让我的文件看到 header 中的内容 (C++)

#ifndef not letting my files see what's in the header (C++)

所以我创建了一个二叉树 class 并且我想通过将 class def 放在 .h 文件和函数中来将 class 定义与其成员函数定义分开.cpp 文件中的定义。然后我会将 .h 文件包含到 .cpp 文件中。现在我把它用于所有工作并且工作正常。问题是当我想输入包括警卫在内的名字时。因为我需要在成员函数 .cpp 文件和另一个使用二叉树 class 的 .cpp 文件中包含 .h 文件,所以我必须包含这些守卫。但出于某种原因,一旦我将它们包含在内,这两个 .cpp 文件似乎都不会“看到”header 文件的内容。我刚开始使用 ifndef,所以我很确定自己做错了什么。谢谢

这是名为 node.h 的 header 文件:

#ifndef NODE_H
#define NODE_H

#include <iostream>
#include <string>
#include <vector>
#include <stdbool.h>
using std::cout;
using std::endl;
typedef std::vector<std::string> vectorString;

class BST  
{ 
    vectorString data; 
    BST *left, *right; 
  
public: 
    // Default constructor. 
    BST(); 
  
    // Parameterized constructor. 
    BST(std::string); 
  
    // Insert function. 
    BST* Insert(BST*, std::string); 
  
    // Inorder traversal. 
    void Inorder(BST*); 

    // PreOrder Traversal.
    void PreOrder(BST*);

    // PostOrder Traversal
    void PostOrder(BST*);

    // string slicer
    std::string strSlice(std::string);

    // boolean isDuplicate
    bool isDuplicate(std::string, vectorString);

    // print vector
    void printVector(vectorString);
};

#endif

这是名为 node.cpp

的成员定义文件


#include <iostream>
//#include "node.h" 
#include <string>
#include <vector>
using std::cout;
using std::endl;
  
  
// Default Constructor definition. 
BST ::BST()
    : data(0) 
    , left(NULL) 
    , right(NULL) 
{ 
} 
  
// Parameterized Constructor definition. 
BST ::BST(std::string value) 
{ 
    if(data.empty()){
        data.push_back(strSlice(value));
    }
        data.push_back(value); 
    
    left = right = NULL; 
} 
  
// String slicing function definition
std::string BST ::strSlice(std::string word){
    std::string word2 = "";
    word2 += word[0];
    word2 += word[1];
    return word2;
}


// print vector function definition
void BST ::printVector(std::vector<std::string> dataVector){
    for(int i = 0; i < dataVector.size(); i ++){
        cout << dataVector.at(i) << " ";
    }
}

// Insert function definition. 
BST* BST ::Insert(BST* root, std::string value) 
{ 
    if (!root)  
    { 
        // Insert the first node, if root is NULL. 

        return new BST(value); 
    } 
  
    // Insert data. 
    if (strSlice(value).compare(root->data.at(0)) > 0)  
    { 
        // Insert right node data, if the 'value' 
        // to be inserted is greater than 'root' node data. 
        cout << value << " is being put in the right node " << value << " > " << root->data.at(0) << endl;
        // Process right nodes. 
        root->right = Insert(root->right, value); 
        
    } else if (strSlice(value).compare(root->data.at(0)) == 0) {

        cout << value << " is being put in the same node " << value << " = " << root->data.at(0)  << endl;
        root->data.push_back(value);
    }
    else 
    { 
        // Insert left node data, if the 'value' 
        // to be inserted is greater than 'root' node data. 
        cout << value << " is being put in the left node " << value << " < " << root->data.at(0) << endl;
        // Process left nodes. 
        root->left = Insert(root->left, value); 
    } 
  
    // Return 'root' node, after insertion. 
    // cout << "after insert root is " << root << endl;
    return root; 
} 
  
// Inorder traversal function. 
// This gives data in sorted order. 
void BST ::Inorder(BST* root) 
{ 
    if (!root) { 
        return; 
    } 
    Inorder(root->left); 
    printVector(root->data);
    cout << endl; 
    Inorder(root->right); 
}
void BST::PreOrder(BST* root){
    if(!root){
        return;
    }
    root->printVector(root->data);
    cout << endl;
    PreOrder(root->left);
    PreOrder(root->right);
} 
void BST::PostOrder(BST* root){
    if(!root){
        return;
    }
    PostOrder(root->left);
    PostOrder(root->right);
    root->printVector(root->data);
    cout << endl;
} 

错误:

C:\Usersjjo\C++ Projects\Project 0\node.cpp:12:1: error: 'BST' does not name a type
 BST ::BST()
 ^~~
C:\Usersjjo\C++ Projects\Project 0\node.cpp:20:1: error: 'BST' does not name a type
 BST ::BST(std::string value)
 ^~~

这是试图实现二叉树 class 的 class,称为 P0.cpp:

#include <iostream>
//#include "tree.h"
#include "cleanString.h"
#include "node.h"
#include <fstream>
#include <string>
using std::cout;

using std::endl;

int main(int argc, char** argv) {
    std::ifstream fileRead;
    std::string word;

    fileRead.open(argv[1]);
    if(!fileRead){
        cout << "this is not a file\n";
    } else { cout << "this is a file\n"; }

    fileRead >> word;
    word = cleanString(word);
    BST tree, *root = nullptr;
    root = tree.Insert(root, word);

    while (fileRead >> word) {
        word = cleanString(word);
        tree.Insert(root, word);
    }

    tree.Inorder(root);

    fileRead.close();


    return 0;
}

错误:

C:/Users/14jjo/C++ Projects/Project 0/P0.cpp:22: undefined reference to `BST::BST()'
C:/Users/14jjo/C++ Projects/Project 0/P0.cpp:23: undefined reference to `BST::Insert(BST*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'

只需 #include "node.h" 并确保编译所有 cpp 文件