Неопределенная ссылка на - PullRequest
1 голос
/ 03 апреля 2010

Я получаю это сообщение об ошибке каждый раз, когда пытаюсь скомпилировать, и я не могу выяснить, в чем проблема. любая помощь будет принята с благодарностью:

C:\DOCUME~1\Patrick\LOCALS~1\Temp/ccL92mj9.o:main.cpp:(.txt+0x184): undefined reference to 'List::List()'
C:\DOCUME~1\Patrick\LOCALS~1\Temp/ccL92mj9.o:main.cpp:(.txt+0x184): undefined reference to 'List::add(int)'
collect2:  ld returned 1 exit status

код:

//List.h

#ifndef LIST_H
#define LIST_H

#include <exception>

//brief Definition of linked list class

class List
{
    public:

    /**
    \brief Exception for operating on empty list
    */  


    class Empty : public std::exception
 {
  public:
  virtual const char* what() const throw();
 };

    /**
    \brief Exception for invalid operations other than operating on an empty list
    */

    class InvalidOperation : public std::exception
 {
  public:
  virtual const char* what() const throw();
 };

    /**
    \brief Node within List
    */


    class Node
 {
  public: 
  /** data element stored in this node */
  int element;

  /** next node in list */
  Node* next;

  /** previous node in list */
  Node* previous;

  Node (int element);
  ~Node();

  void print() const;
  void printDebug() const;
 };


    List();
    ~List();

    void add(int element);
    void remove(int element);
    int first()const;
    int last()const;
    int removeFirst();
    int removeLast();
    bool isEmpty()const;
    int size()const;
    void printForward() const;    
    void printReverse() const;
    void printDebug() const;

    /**
    enables extra output for debugging purposes
    */
    static bool traceOn;

    private:
    /** head of list */
    Node* head;
    /** tail of list */
    Node* tail;
    /** count of number of nodes */
    int count;
};
#endif


//List.cpp                   I only included the parts of List.cpp that might be the issue
#include "List.h"
#include <iostream>
#include <iomanip>

using namespace std;


List::List()
{
 //List::size = NULL;
 head = NULL;
 tail = NULL;
}


List::~List()
{
 Node* current;
 while(head != NULL)
 {
  current = head-> next;
  delete current->previous;
  if (current->next!=NULL)
  {
   head = current;
  }
  else
  {
   delete current;
  }
 }
}

void List::add(int element)
{
 Node* newNode;
 Node* current;
 newNode->element = element;
 if(newNode->element > head->element)
 {
  current = head->next;
 }
 else
 {
  head->previous = newNode;
  newNode->next = head;
  newNode->previous = NULL;
  return;
 }

 while(newNode->element > current->element)
 {
  current = current->next;
 }

 if(newNode->element <= current->element)
 {
  newNode->previous = current->previous;
  newNode->next = current;
 }

}


//main.cpp
#include "List.h"
#include <iostream>
#include <string>

using namespace std;
//void add(int element);

int main (char** argv, int argc)
{    
 List* MyList = new List();
 bool quit = false;
 string value;
 int element;

 while(quit==false)
 {
  cin>>value;

  if(value == "add")
  {
   cin>>element;
   MyList->add(element);
  }
  if(value=="quit")
  {
   quit = true;
  }
 }
    return 0;
}

Я делаю все, что, как мне кажется, я делаю. main.cpp еще не завершен, просто пытаюсь заставить функцию add работать сначала. Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

3 голосов
/ 03 апреля 2010

Вы не компилируете List.cpp. Добавьте его в командную строку.

В main.cpp он видит (из List.h) «Эй, этот класс с этой функциональностью будет существовать», но поскольку вы на самом деле не строите / не связываете с List.cpp, он не может найти функции он ищет.

3 голосов
/ 03 апреля 2010

Опишите ваш процесс сборки. Похоже, что вы не создаете List.cpp или не связываете его с main.cpp.

1 голос
/ 03 апреля 2010

Ваша командная строка должна выглядеть примерно так: g++ -o test.exe main.cpp List.cpp.

Ключевой особенностью является включение main.cpp и List.cpp.

Есть и другие способы сделать это, но это поможет вам начать.

0 голосов
/ 29 ноября 2014

Ваша проблема не включает все различные файлы в вашей командной строке arg compiler

Правильный формат:

получить в правильном каталоге

gcc-o list main.cpp List.cpp List.h

тогда вы больше не получите неопределенных ссылок на функции

Удачи в создании вашей 3 или 4-летней программы ...

...