【问题标题】:Undefined reference to class when the class is defined定义类时对类的未定义引用
【发布时间】:2015-03-20 17:30:51
【问题描述】:

最近,我开始学习 C++。已经了解了一些 python,我决定尝试理解指针,但是在尝试编译文件时遇到了错误。错误消息有点令人困惑,我已经坚持了一段时间。关于 SO 的答案确实提供了对该问题的一些见解,但由于我还是 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;
}

这是错误信息 -

"/usr/bin/make" -f nbproject/Makefile-Debug.mk QMAKE= SUBPROJECTS= .build-conf
make[1]: Entering directory '/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2'
"/usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/Cygwin_4.x-Windows/cppapplication_2.exe
make[2]: Entering directory '/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2'
mkdir -p dist/Debug/Cygwin_4.x-Windows
g++ -std=c++11    -o dist/Debug/Cygwin_4.x-Windows/cppapplication_2 build/Debug/Cygwin_4.x-Windows/main.o 
build/Debug/Cygwin_4.x-Windows/main.o: In function `Uinter::reunion(int, int)':
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:56: undefined reference to `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:56:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0x3f): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:65: undefined reference to `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:65:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0xa4): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:71: undefined reference to `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:71:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0xf7): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:77: undefined reference to `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:77:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0x154): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:99: undefined reference to `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:99:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0x23d): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
build/Debug/Cygwin_4.x-Windows/main.o:/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:105: more undefined references to `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)' follow
build/Debug/Cygwin_4.x-Windows/main.o: In function `Uinter::reunion(int, int)':
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:105:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0x28d): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:111:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0x2e8): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2/main.cpp:119:(.text$_ZN6Uinter7reunionEii[_ZN6Uinter7reunionEii]+0x349): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `Uinter::_Inter::_Inter(int, int, Uinter::_Inter*)'
collect2: error: ld returned 1 exit status
nbproject/Makefile-Debug.mk:62: recipe for target 'dist/Debug/Cygwin_4.x-Windows/cppapplication_2.exe' failed
make[2]: *** [dist/Debug/Cygwin_4.x-Windows/cppapplication_2.exe] Error 1
make[2]: Leaving directory '/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2'
nbproject/Makefile-Debug.mk:59: recipe for target '.build-conf' failed
make[1]: *** [.build-conf] Error 2
make[1]: Leaving directory '/cygdrive/c/Users/Iocust/Documents/NetBeansProjects/CppApplication_2'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make: *** [.build-impl] Error 2

很抱歉提供了如此不明确的代码。如果有任何相关性,我使用的是 NetBeans 8.0.2。

【问题讨论】:

  • 错误信息是正确的。 Uinter::_Inter::_Inter(int, int, Uinter::_Inter*) 不是类。

标签: c++ class reference nested undefined


【解决方案1】:

您有一个链接器错误。问题出在这里:

public:
    _Inter(int, int, _Inter*);

您没有定义构造函数,而只是声明了它,因此链接器会抱怨(它找到了声明,但没有找到定义)。您需要定义,因为没有它,您将无法构造对象_Inter。如果你没有为构造函数提供任何声明,那么编译器会为你生成一个默认的,但是在这种情况下你提供了一个声明,所以没有更多的默认构造函数生成。

您需要为Uinter::_Inter 构造函数提供定义,可以是内联的

public:
    _Inter(int, int, _Inter*){/* definition here */}

或课外

Uinter::_Inter(int, int, _Inter*){/* definition here */}

也许你想命名你的构造函数参数

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

因为你需要它们。

【讨论】:

  • 感谢您的快速评论!很抱歉,但正如我所说,我在 C++ 方面仍然缺乏经验。我认为你提到的那一行是构造函数本身。我正在做的只是“声明”构造函数吗?编辑 - 感谢您的有见地的回答!我想我明白了:)
  • 您只需告诉编译器具有该签名的函数将在其他地方定义,因此您可以在完整定义之前使用它。例如,参见cprogramming.com/declare_vs_define.html PS:每当在编译结束时看到类似error: ld returned 1 exit status 的内容时,就会出现链接器错误(ld 是类UNIX 平台上的链接器名称)。所以代码编译正确,但是(大多数时候)您使用的某些函数缺少定义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2021-11-30
相关资源
最近更新 更多