- 论坛徽章:
- 0
|
在C中可以将库文件编译成.o后,在编译.c时顺序添加.o就能将.o中的函数联编到程序中。
在C++中可以这么做么?一下是我的例子,编译出错,请指教!
[头文件“stringClassTest.h”]
#include <iostream>;
using namespace std ;
class String ;
istream& operator>;>;(istream& , String&
ostream& operator<<(ostream& , String&
class String
{
public :
String();
String(const char *);
String(const String&
~String();
String& operator=(const String&
String& operator=(const char *);
bool operator==(const String&
bool operator==(const char *);
char& operator[](int);
int size() {return _size;}
char* c_str(){return _string;}
private :
char *_string ;
int _size ;
};
[类函数实现.C “stringClassTest.C”]
#include <cstring>;
#include <cassert>;
#include <iomanip>;
#include "stringClassTest.h"
bool String:perator==(const String &rhs)
{
if ( _size != rhs._size)
return false ;
else
return strcmp(_string , rhs._string )? false : true ;
}
bool String:perator==(const char * rhc)
{
return strcmp(_string , rhc )? false : true ;
}
inline String::String()
{
_size = 0 ;
_string = NULL ;
}
inline String::String(const char * rhc)
{
if (rhc == NULL)
{
_size = 0 ;
_string = NULL ;
}
else
{
_size = strlen(rhc);
_string = new char[_size+1] ;
strcpy(_string , rhc);
}
}
inline String::String(const String &rhs)
{
if (rhs._string == NULL)
{
_size = 0 ;
_string = NULL ;
}
else
{
_size = rhs._size ;
_string = new char[_size+1] ;
strcpy(_string , rhs._string);
}
}
inline String::~String()
{
delete [] _string ;
}
inline String& String:perator=(const String &rhs)
{
if (this != &rhs)
{
delete [] _string ;
if (rhs._string == NULL)
{
_size = 0 ;
_string = NULL;
}
else
{
_size = rhs._size ;
_string = new char[_size+1];
strcpy(_string , rhs._string);
}
}
return *this;
}
inline String& String:perator=(const char *rhc)
{
delete [] _string ;
if (rhc == NULL)
{
_size = 0 ;
_string == NULL ;
}
else
{
_size = strlen(rhc);
_string = new char[_size+1];
strcpy(_string , rhc);
}
return *this ;
}
inline char& String:perator[](int elem)
{
assert(elem >;=0 && elem <_size);
return _string[elem];
}
inline istream& operator>;>;(istream &io , String &rhs)
{
const int limit_string_size = 4096 ;
char inBuf[limit_string_size] ;
io >;>; setw(limit_string_size) >;>; inBuf ;
rhs = inBuf ;
return io ;
}
inline ostream& operator<<(ostream &os , String &rhs)
{
return os << rhs.c_str();
}
[应用程序Stringtest.c]
#include <iostream>;
#include "stringClassTest.h"
using namespace std ;
int main()
{
String a ;
a="String type" ;
cout << a << endl ;
}
先使用gcc -c stringClassTest.C 编译成stringClassTest.o,ok。
再用g++ -o Stringtest Stringtest.C stringClassTest.o 出错。
Undefined first referenced
symbol in file
operator<<(std::basic_ostream<char, std::char_traits<char>; >;&, String&/var/tmp/
/ccAeDx8c.o
String::String[in-charge]() /var/tmp//ccAeDx8c.o
String::~String [in-charge]() /var/tmp//ccAeDx8c.o
String:perator=(char const*) /var/tmp//ccAeDx8c.o
ld: fatal: Symbol referencing errors. No output written to Stringtest
collect2: ld returned 1 exit status
为什么?怎么办? |
|