2015-03-20 3 views
0

Недавно я начал изучать 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.

+0

Сообщение об ошибке верное. 'Uinter :: _ Inter :: _ Inter (int, int, Uinter :: _ Inter *)' не является классом. – chris

ответ

2

У вас ошибка компоновщика. Проблема заключается здесь:

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) 

как вам понадобятся.

+0

Спасибо за быстрый комментарий! Извините, но, как я уже сказал, я все еще неопытен в C++. Я думал, что строка, о которой вы говорили, была сама конструктор. Является ли то, что я делаю, только «объявляя» конструктор? Редактировать - Спасибо за проницательный ответ! Я думаю, что у меня это получилось :) – Iocust

+1

Вы просто скажете компилятору, что функция с этой сигнатурой будет определена где-то в другом месте, поэтому вы можете использовать ее до полного определения. См. Например, http://www.cprogramming.com/declare_vs_define.html PS: всякий раз, когда в конце компиляции вы видите что-то вроде 'error: ld return 1 exit status', у вас есть ошибка компоновщика (' ld' - это имя компоновщика на UNIX-подобных платформах). Таким образом, код скомпилирован правильно, но (в большинстве случаев) отсутствует определение для некоторой функции, которую вы используете. – vsoftco