指针链接器错误

时间:2010-02-04 16:06:15

标签: c++ pointers linker linker-errors

我正在尝试构建一个程序来 Tolkinize 一个字符串(我正在尝试使用字符串类来执行此操作 - 以便了解有关指针以及字符如何工作的更多信息) - 我已经构建了一个我认为有效的程序(任何建议都会很棒!)当我尝试编译程序时,我得到了这些随机错误:

  

错误1错误LNK2019:函数_main驱动程序中引用的未解析的外部符号“public:char * __thiscall Tokenize :: next(void)”(?next @ Tokenize @@ QAEPADXZ)

     

错误2错误LNK2019:函数_main驱动程序中引用的未解析的外部符号“public:__thiscall Tokenize :: Tokenize(char const * const,char)”(?? 0Tokenize @@ QAE @ QBDD @ Z)

     

错误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 个答案:

答案 0 :(得分:2)

看起来你没有编译/链接tokenize.cpp。

可能不是代码本身,而是如何在Visual Studio中进行设置。

VS是否可能在您的应用程序中不包含tokenize.cpp?

您可以通过将函数从tokenize.cpp移动到main.cpp来测试此问题。如果错误消失,那就是问题。

答案 1 :(得分:2)

与链接器无关,但在标题Tokenizer.h中,您说:

 #include "Tokenize.h"

什么是Tokenize.h?你还没有表现出来。此外,你的包含守卫似乎在防范这个档案。

答案 2 :(得分:2)

您发布的代码存在一些问题。按发现顺序:

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

您正在尝试将const指针指定给非const成员变量。不能这样做;将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