定义类时对类的未定义引用 最近,我开始学习C++。我已经了解了一些python,所以决定尝试理解指针,但在编译文件时遇到了一个错误。这个错误消息有点让人困惑,我已经在上面呆了一段时间了。这样做的答案提供了一些问题的见解,但因为我还是新的C++,我真的不知道如何修复它。我已经读到默认构造函数声明可能有问题,但我不确定要修复什么 #include <cstddef> #include <iostream> using namespace std; class Uinter /* * Regrouping class for intervals (_Inter class) * offering 3 different methods: * "reunion(int bi, int bs)" -> Unites the interval pointed by "_tete" * with the one defined by [bi, bs] * "printUinter()" -> Prints the interval pointed by "_tete" * "contient(int nb)" -> Returns True if "nb" is present inside * the intervals, else False. */ { class _Inter /* * Class representing a single interval. * _bi stands for the lower limit of the interval. * _bs stands for the upper limit of the interval. */ { int _bi, _bs; _Inter* _next; public: _Inter(int, int, _Inter*); // Defining getters and setters for the interval. void set_bi(int value) {_bi = value;} void set_bs(int value) {_bs = value;} void set_next(_Inter* value) {_next = value;} int get_bi() {return _bi;} int get_bs() {return _bs;} _Inter* get_next() {return _next;} }; _Inter* _tete; public: Uinter(): _tete(nullptr){} void reunion(int bi, int bs) { if(_tete == nullptr) { _Inter new_interval = _Inter(bi, bs, nullptr); _tete = &new_interval; } else { if(bi < _tete->get_bi()) { if (bs < _tete->get_bi()) { _Inter new_interval = _Inter(bi, bs, _tete); _tete = &new_interval; } else if (bs > _tete->get_bs()) { _Inter new_interval = _Inter(bi, bs, _tete->get_next()); _tete = &new_interval; } else if (bs > _tete->get_bi()) { _Inter new_interval = _Inter(bi, _tete->get_bs(), _tete->get_next()); _tete = &new_interval; } } else if (bi > _tete->get_bi()) { if (bi > _tete->get_bs()) { _Inter temp = *_tete->get_next(); // delete later while(&temp != nullptr && bi > temp.get_bs()) { temp = *temp.get_next(); } if (&temp == nullptr) { _Inter new_interval = _Inter(bi, bs, nullptr); //temp.set_next(new_interval); } else if (bi < temp.get_bi()) // bi < temp.get_bs() { if (bs < temp.get_bi()) { _Inter new_interval = _Inter(bi, bs, _tete); _tete = &new_interval; } else if (bs > temp.get_bs()) { _Inter new_interval = _Inter(bi, bs, _tete->get_next()); _tete = &new_interval; } else if (bs > temp.get_bi()) { _Inter new_interval = _Inter(bi, _tete->get_bs(), _tete->get_next()); _tete = &new_interval; } } else if (bi > temp.get_bi()) // bi < temp.get_bs() { if (bs > temp.get_bs()) { _Inter new_interval = _Inter(temp.get_bi(), bs, nullptr); temp = new_interval; } } } } } } void printUinter(); bool contient(int nb); void order(); }; int main() { Uinter interval; interval.reunion(12, 23); return 0; }

定义类时对类的未定义引用 最近,我开始学习C++。我已经了解了一些python,所以决定尝试理解指针,但在编译文件时遇到了一个错误。这个错误消息有点让人困惑,我已经在上面呆了一段时间了。这样做的答案提供了一些问题的见解,但因为我还是新的C++,我真的不知道如何修复它。我已经读到默认构造函数声明可能有问题,但我不确定要修复什么 #include <cstddef> #include <iostream> using namespace std; class Uinter /* * Regrouping class for intervals (_Inter class) * offering 3 different methods: * "reunion(int bi, int bs)" -> Unites the interval pointed by "_tete" * with the one defined by [bi, bs] * "printUinter()" -> Prints the interval pointed by "_tete" * "contient(int nb)" -> Returns True if "nb" is present inside * the intervals, else False. */ { class _Inter /* * Class representing a single interval. * _bi stands for the lower limit of the interval. * _bs stands for the upper limit of the interval. */ { int _bi, _bs; _Inter* _next; public: _Inter(int, int, _Inter*); // Defining getters and setters for the interval. void set_bi(int value) {_bi = value;} void set_bs(int value) {_bs = value;} void set_next(_Inter* value) {_next = value;} int get_bi() {return _bi;} int get_bs() {return _bs;} _Inter* get_next() {return _next;} }; _Inter* _tete; public: Uinter(): _tete(nullptr){} void reunion(int bi, int bs) { if(_tete == nullptr) { _Inter new_interval = _Inter(bi, bs, nullptr); _tete = &new_interval; } else { if(bi < _tete->get_bi()) { if (bs < _tete->get_bi()) { _Inter new_interval = _Inter(bi, bs, _tete); _tete = &new_interval; } else if (bs > _tete->get_bs()) { _Inter new_interval = _Inter(bi, bs, _tete->get_next()); _tete = &new_interval; } else if (bs > _tete->get_bi()) { _Inter new_interval = _Inter(bi, _tete->get_bs(), _tete->get_next()); _tete = &new_interval; } } else if (bi > _tete->get_bi()) { if (bi > _tete->get_bs()) { _Inter temp = *_tete->get_next(); // delete later while(&temp != nullptr && bi > temp.get_bs()) { temp = *temp.get_next(); } if (&temp == nullptr) { _Inter new_interval = _Inter(bi, bs, nullptr); //temp.set_next(new_interval); } else if (bi < temp.get_bi()) // bi < temp.get_bs() { if (bs < temp.get_bi()) { _Inter new_interval = _Inter(bi, bs, _tete); _tete = &new_interval; } else if (bs > temp.get_bs()) { _Inter new_interval = _Inter(bi, bs, _tete->get_next()); _tete = &new_interval; } else if (bs > temp.get_bi()) { _Inter new_interval = _Inter(bi, _tete->get_bs(), _tete->get_next()); _tete = &new_interval; } } else if (bi > temp.get_bi()) // bi < temp.get_bs() { if (bs > temp.get_bs()) { _Inter new_interval = _Inter(temp.get_bi(), bs, nullptr); temp = new_interval; } } } } } } void printUinter(); bool contient(int nb); void order(); }; int main() { Uinter interval; interval.reunion(12, 23); return 0; },c++,class,reference,nested,undefined,C++,Class,Reference,Nested,Undefined,很抱歉提供了这样一个不清楚的代码。如果与此相关,我使用的是NetBeans 8.0.2。您有一个链接器错误。问题在于: public: _Inter(int, int, _Inter*); 您没有定义构造函数,而只是声明它,因此链接器会抱怨(它找到了声明,但没有找到定义)。您需要定义,因为没有它,您无法构造对象\u Inter。如果您没有为构造函数提供任何声明,那么编译器将为您生成一个默认的声明,但在本例中,您提供了一个声明,因此不再生成默认构造函数 您需要为Uinter::\u In

很抱歉提供了这样一个不清楚的代码。如果与此相关,我使用的是NetBeans 8.0.2。

您有一个链接器错误。问题在于:

public:
    _Inter(int, int, _Inter*);
您没有定义构造函数,而只是声明它,因此链接器会抱怨(它找到了声明,但没有找到定义)。您需要定义,因为没有它,您无法构造对象
\u Inter
。如果您没有为构造函数提供任何声明,那么编译器将为您生成一个默认的声明,但在本例中,您提供了一个声明,因此不再生成默认构造函数

您需要为
Uinter::\u Inter
构造函数提供一个定义,可以是内联的

public:
    _Inter(int, int, _Inter*){/* definition here */}
还是课外

Uinter::_Inter(int, int, _Inter*){/* definition here */}
也许你会想命名你的构造函数参数

_Inter(int param1, int param2, _Inter* param3)

您将需要它们。

错误消息是正确的
Uinter::\u Inter::\u Inter(int,int,Uinter::\u Inter*)
不是这个类。感谢您的快速评论!很抱歉,但正如我所说,我还没有经验的C++。我以为你提到的那行是构造器本身。我所做的只是“声明”构造函数吗?编辑-谢谢你的有见地的回答!我想我明白了:)你只要告诉编译器,一个具有该签名的函数将在其他地方定义,这样你就可以在完整定义之前使用它。请参阅示例PS:每当在编译结束时看到类似于
error:ld returned 1 exit status
,就会出现链接器错误(
ld
是类UNIX平台上链接器的名称)。因此代码编译正确,但是(大多数情况下)您使用的某些函数缺少定义。
_Inter(int param1, int param2, _Inter* param3)