0

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

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

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

错误 3 致命错误 LNK1120: 2 unresolved externals C:\Users\Simmons 2.0\Documents\School\CS1410\project 5\Token\Debug\Token.exe

我已经向几个朋友展示了这段代码,他们都不知道发生了什么——或者我做错了什么……

注意:我正在运行 VS 2008 express edition - Windows 7 x64


主文件

#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;
}

标记化.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

标记化.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()

4

3 回答 3

2

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

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

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

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

于 2010-02-04T16:12:57.003 回答
2

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

 #include "Tokenize.h"

什么是 Tokenize.h?你没有表现出来。此外,您的包含警卫似乎正在防范此文件。

于 2010-02-04T16:13:52.380 回答
2

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

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

您正在尝试将 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

于 2010-02-04T16:31:12.200 回答