Ошибка компоновщика с указателями - PullRequest
0 голосов
/ 04 февраля 2010

Я пытаюсь построить программу для Tolkinize строки (я пытаюсь сделать это без использования класса string - чтобы узнать больше об указателях и как работают символы) - у меня есть построил программу, которая, я думаю, работает (любые предложения были бы хорошими!) Когда я пытался скомпилировать программу, я получаю следующие случайные ошибки:

Ошибка 1, ошибка LNK2019: неразрешенный внешний символ «public: char * __thiscall Tokenize :: next (void)» (? Next @ Tokenize @@ QAEPADXZ), на который есть ссылка в функции _main Driver

Ошибка 2, ошибка LNK2019: неразрешенный внешний символ «public: __thiscall Tokenize :: Tokenize (char const * const, char)» (?? 0Tokenize @@ QAE @ QBDD @ Z), на который есть ссылка в функции _main Driver

Ошибка 3: фатальная ошибка LNK1120: 2 неразрешенных внешних кода C: \ Users \ Simmons 2.0 \ Documents \ School \ CS1410 \ project 5 \ Token \ Debug \ Token.exe

Я показал этот код нескольким друзьям, этот код, и никто из них не мог понять, что происходит - или что я делаю неправильно ...

Примечание. Я использую VS 2008 Express Edition - Windows 7 x64

main.cpp

#include <iostream>
#include "tokenize.h" /// Tolkenize class
using namespace std;

int main ( )
{

 // create a place to hold the user's input
 // and a char pointer to use with the next( ) function
 char words[128];
 char * nextWord;

 cout << "\nString Tokenizer Project";
 cout << "Enter in a short string of words:";
 cin.getline ( words, 127 );

 // create a tokenizer object, pass in the char array
 // and a space character for the delimiter
 Tokenize tk( words, ' ' );

 // this loop will display the tokens
 while ( ( nextWord = tk.next() ) != NULL ) {
  cout << nextWord << endl;
    }

    system("PAUSE");
 return 0;
}

tokenize.h

#include <iostream>
#include <cassert>  /// assert
#include <cstdlib>  /// system("cls")
using namespace std;

#ifndef TOKENIZE_H
#define TOKENIZE_H

#include <iostream>
#include <cassert>
#include "Tokenize.h"
using namespace std;

class Tokenize {
private:
 char * current_ptr;
 char delimiter;
public:
 Tokenize ();
 Tokenize (char);
 Tokenize (char const string [], char Delimiter);
 void setcurrent_ptr ( char * ptr ){ current_ptr = ptr; }
 void setdelimiter ( char Delimiter ) { delimiter = Delimiter; }
 char * getcurrent_ptr () { return current_ptr; }
 char getdelimiter () { return delimiter; }
 char * next ();
};          

#endif

tokenize.cpp

#include <iostream>
#include <cassert>  /// assert
#include "Tokenize.h"
using namespace std;

Tokenize::Tokenize() { 
 current_ptr = new char;
 *current_ptr = NULL;
 delimiter = ' ';
};

Tokenize::Tokenize(char Delimiter) {
 current_ptr = new char;
 *current_ptr = NULL;
 delimiter = Delimiter;
};

Tokenize::Tokenize(char const string [], char Delimiter) {
 current_ptr = string;
 delimiter = Delimiter;
};

char * Tokenize::next() {
 char * ptr = current_ptr;
 If ( (*ptr) == NULL ) { return NULL; }
 else {
  while ((current_ptr)++ != ' ') {}
  if ( (*current_ptr) == NULL) { return NULL; }
  if ( *current_ptr == ' ' ) { *current_ptr = '/0'; (current_ptr)++; }
  return ptr;
 }
};

Из моего тестирования (комментируя строки) я думаю, что одна из ошибок произошла от tokinze.next()

Ответы [ 3 ]

2 голосов
/ 04 февраля 2010

Не для компоновщика, а в заголовке Tokenizer.h вы говорите:

 #include "Tokenize.h"

что такое Tokenize.h? Вы не показали это. Кроме того, ваши включенные охранники, кажется, защищают от этого файла.

2 голосов
/ 04 февраля 2010

Было несколько проблем с вашим размещенным кодом. В порядке открытия:

Tokenize::Tokenize(char const string [], char Delimiter) {
 current_ptr = string;
 delimiter = Delimiter;
};

Вы пытаетесь присвоить константный указатель неконстантной переменной-члену. Не могу этого сделать; изменить определение Tokenize ctor на:

Tokenize::Tokenize(char * const string , char Delimiter) {
 current_ptr = string;
 delimiter = Delimiter;
};

В Tokenize :: next () изменить:

  while ((current_ptr)++ != ' ') {}

... чтобы:

  while (*(current_ptr++) != ' ') {}

И чуть ниже у вас плохая последовательность побега. Изменения:

  if ( *current_ptr == ' ' ) { *current_ptr = '/0'; (current_ptr)++; }

... в:

if ( *current_ptr == ' ' ) { *current_ptr = '\0'; (current_ptr)++; }

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

2 голосов
/ 04 февраля 2010

Похоже, вы не компилируете / не связываете tokenize.cpp.

Вероятно, это не сам код, а то, как он настроен в Visual Studio.

Возможно ли, что VS не включает tokenize.cpp в ваше приложение?

Вы можете проверить, что это является проблемой, переместив функции из tokenize.cpp в main.cpp. Если ошибки исчезнут, вот в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...