如何基于我自己的对象正确实现我的自定义节点类?

时间:2019-07-13 18:26:41

标签: c++ class

我实现了一个名为Customer的类,这是头文件:效果很好。

现在,基于我的客户类,我想实现一个BST树来存储客户信息,但是我需要一个节点类,其中包含客户对象,指向左子对象和右子对象的指针。我有关于正确实现Node类的麻烦。尤其是对于Customer对象。

class Customer {
public:
    Customer(string,char,int);
    string get_name();
    char get_initial();
    int get_account();
    void set_account(int);
    bool operator<(Customer & c);
    bool operator<=(Customer & c);
    bool operator>(Customer & c);
    bool operator>=(Customer & c);
    bool operator==(Customer & c);
    bool operator!=(Customer & c);

private:
    string name;
    char initial;
    int account;
    friend ostream& operator<<(ostream & os,  Customer & c);
};

#ifndef NODE_H_
#define NODE_H_

#include "Customer.h"

class Node {
public:
    Customer parent;
    Node* left;
    Node* right;
};

#endif /* NODE_H_ */

显示的错误:被隐式删除,因为默认定义格式不正确:

1 个答案:

答案 0 :(得分:2)

这里的问题与default constructor类的Node有关。如果没有其他用户定义的构造函数,则会在class中自动生成默认的构造函数。因此,默认构造函数尝试为该类的所有成员生成默认值,并在尝试调用不存在的对象Customer的默认构造函数时遇到问题(因为构造函数{{1} }存在,并且Customer(string,char,int);类没有用户定义的默认构造函数)。您可以使用几种解决方案(在这种情况下,从最推荐到最不推荐。在其他情况下,此比率可能会有所变化):


解决方案1(推荐)

Customer类中定义一个构造函数,该构造函数使用Node类成员Customer的非默认构造函数:

parent

解决方案2

class Node { public: Node(string name, char c, int age) : parent(name, c, age) {} Customer parent; Node* left; Node* right; }; 类定义默认构造函数:

Customer

为什么在这种情况下不是最推荐的方法?它比最推荐的方法用更少的代码解决了编译器的错误,那么为什么不选择这种方法呢?这种方式存在逻辑问题-空客户是什么意思?您怎么知道class Customer { public: /*...*/ Customer(); /*...*/ } 对象何时为空?您可以在这里看到我的答案:C++ vector of struct allocated on stack,以找出未创建任何用户定义数据的对象。这些验证比强迫用户提前设置一些数据要复杂得多。

但是-当没有像我之前提到的逻辑问题时,或者在不需要处理验证时,或者在这种解决方案中值得选择验证的情况下,这种方法可能是最好的方法。


解决方案3(强烈建议)

Customer类中的parent定义为指针(因此默认值为Node)。

为什么不选择此选项?此选项可能是使编译器错误消失的最简单,最快的方法-但是,这将迫使您一直在处理指针的指针和内存管理程序,将使您的生活比其他解决方案困难得多(在编译器错误消失后-nullptrWhat is a segmentation fault?)比编译器错误更令人讨厌)。