我实现了一个名为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_ */
显示的错误:被隐式删除,因为默认定义格式不正确:
答案 0 :(得分:2)
这里的问题与default constructor
类的Node
有关。如果没有其他用户定义的构造函数,则会在class
中自动生成默认的构造函数。因此,默认构造函数尝试为该类的所有成员生成默认值,并在尝试调用不存在的对象Customer
的默认构造函数时遇到问题(因为构造函数{{1} }存在,并且Customer(string,char,int);
类没有用户定义的默认构造函数)。您可以使用几种解决方案(在这种情况下,从最推荐到最不推荐。在其他情况下,此比率可能会有所变化):
Customer
类中定义一个构造函数,该构造函数使用Node
类成员Customer
的非默认构造函数:
parent
为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,以找出未创建任何用户定义数据的对象。这些验证比强迫用户提前设置一些数据要复杂得多。
但是-当没有像我之前提到的逻辑问题时,或者在不需要处理验证时,或者在这种解决方案中值得选择验证的情况下,这种方法可能是最好的方法。
Customer
类中的parent
定义为指针(因此默认值为Node
)。
为什么不选择此选项?此选项可能是使编译器错误消失的最简单,最快的方法-但是,这将迫使您一直在处理指针的指针和内存管理程序,将使您的生活比其他解决方案困难得多(在编译器错误消失后-nullptr
(What is a segmentation fault?)比编译器错误更令人讨厌)。