| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 496 人关注过本帖
标题:求助:关于c++程序设计语言(特别版)上的问题。
只看楼主 加入收藏
rediums
Rank: 2
等 级:新手上路
威 望:3
帖 子:367
专家分:0
注 册:2007-7-29
结帖率:100%
收藏
 问题点数:0 回复次数:6 
求助:关于c++程序设计语言(特别版)上的问题。
我在看c++程序设计语言第三版(特别版)(The C++ Programming Language Special Edition)
按照书上第11章,运算符重载那一章,我把最后的那个string类做了一下,可是总是出错,有人
有书上那个string类的代码吗?

跪求!!!
谢谢大哥大姐们!!
搜索更多相关主题的帖子: 程序设计 语言 程序设计 语言 
2007-09-17 22:02
HensJimmer
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2007-8-20
收藏
得分:0 
可以把书上的程序打下来吗?

2007-09-17 22:34
rediums
Rank: 2
等 级:新手上路
威 望:3
帖 子:367
专家分:0
注 册:2007-7-29
收藏
得分:0 

//file1:mystring.h

#include <cstring>

namespace smr{
class String{
struct Srep{
char* s;
int sz;
int n;

Srep(int nsz,const char* p)
{
n=1;
sz=nsz;
s=new char[sz+1];
std::strcpy(s,p);
}

~Srep(){delete[] s;}

Srep* get_own_copy()
{
if(n==1) return this;
n--;
return new Srep(sz,s);
}

void assign(int nsz,const char* p)
{
if(sz!=nsz){
delete[] s;
sz=nsz;
s=new char[sz+1];
}
std::strcpy(s,p);
}
private:
Srep(const Srep&);
Srep& operator=(const Srep&);
};
Srep* rep;

public:
String();
String(const char*);
String(const String&);
String& operator=(const char*);
String& operator=(const String&);
~String();

void check(int i)const;
char read(int i)const;
void write(int i,char c);
int size()const;

class Rang{};
class Cref;

Cref operator[](int i);
char operator[](int i)const;

};

class String::Cref{
friend class String;
String& s;
int i;
Cref(String& ss,int ii):s(ss),i(ii){}
public:
operator char(){return s.read(i);}
void operator=(char c){s.write(i,c);}
};
}

// file2:myString.cpp

#include "myString.h"

namespace smr{

String::String()
{
rep=new Srep(0,"");
}
String::String(const char* s)
{
rep=new Srep(strlen(s),s);
}
String::String(const String& x)
{
x.rep->n++;
rep=x.rep;
}
String& String::operator=(const String& x)
{
x.rep->n++;
if(--rep->n==0) delete rep;
rep=x.rep;
return *this;
}
String& String::operator=(const char* s)
{
if(rep->n==1)
rep->assign(strlen(s),s);
else{
rep->n--;
rep=new Srep(strlen(s),s);
}
return *this;
}
String::~String()
{
if(--rep->n==0) delete rep;
}

inline void String::check(int i)const
{if(i<0 || rep->sz<=i) throw Rang();}

inline char String::read(int i)const
{return rep->s[i];}

inline void String::write(int i,char c)
{rep=rep->get_own_copy();rep->s[i]=c;}

inline int String::size()const{return rep->sz;}

inline String::Cref String::operator[](int i) //////////////////////////////编译的时候这个不能生成
{check(i);return String::Cref(*this,i);}

inline char String::operator[](int i)const
{check(i);return rep->s[i];}
}


d:\c++\main\mystring.h(71) : warning C4512: “smr::String::Cref”: 未能生成赋值运算符
d:\c++\main\mystring.h(63) : 参见“smr::String::Cref”的声明


2007-09-17 22:51
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

加个main函数测试一下。
在DEV C++ VC++2005下测试通过。。。


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-09-18 00:54
rediums
Rank: 2
等 级:新手上路
威 望:3
帖 子:367
专家分:0
注 册:2007-7-29
收藏
得分:0 
无法解析的外部符号 "public: class smr::String::Cref __thiscall smr::String::operator[](int)"
无法解析的外部符号 "public: void __thiscall smr::String::write(int,char)"

用main测试的时候会出现上面的错误

2007-09-18 11:41
yuyunliuhen
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:1435
专家分:0
注 册:2005-12-12
收藏
得分:0 

//myString.h
#include <cstring>

namespace smr{
class String{
struct Srep{
char* s;
int sz;
int n;

Srep(int nsz,const char* p)
{
n=1;
sz=nsz;
s=new char[sz+1];
std::strcpy(s,p);
}

~Srep(){delete[] s;}

Srep* get_own_copy()
{
if(n==1) return this;
n--;
return new Srep(sz,s);
}

void assign(int nsz,const char* p)
{
if(sz!=nsz){
delete[] s;
sz=nsz;
s=new char[sz+1];
}
std::strcpy(s,p);
}
private:
Srep(const Srep&);
Srep& operator=(const Srep&);
};
Srep* rep;

public:
String();
String(const char*);
String(const String&);
String& operator=(const char*);
String& operator=(const String&);
~String();

void check(int i)const;
char read(int i)const;
void write(int i,char c);
int size()const;

class Rang{};
class Cref;

Cref operator[](int i);
char operator[](int i)const;

};

class String::Cref{
friend class String;
String& s;
int i;
Cref(String& ss,int ii):s(ss),i(ii){}
public:
operator char(){return s.read(i);}
void operator=(char c){s.write(i,c);}
};
}


//main.cpp

#include "myString.h"

namespace smr{

String::String()
{
rep=new Srep(0,"");
}
String::String(const char* s)
{
rep=new Srep(strlen(s),s);
}
String::String(const String& x)
{
x.rep->n++;
rep=x.rep;
}
String& String::operator=(const String& x)
{
x.rep->n++;
if(--rep->n==0) delete rep;
rep=x.rep;
return *this;
}
String& String::operator=(const char* s)
{
if(rep->n==1)
rep->assign(strlen(s),s);
else{
rep->n--;
rep=new Srep(strlen(s),s);
}
return *this;
}
String::~String()
{
if(--rep->n==0) delete rep;
}

inline void String::check(int i)const
{if(i<0 || rep->sz<=i) throw Rang();}

inline char String::read(int i)const
{return rep->s[i];}

inline void String::write(int i,char c)
{rep=rep->get_own_copy();rep->s[i]=c;}

inline int String::size()const{return rep->sz;}

inline String::Cref String::operator[](int i) //////////编译的时候这个不能生成
{check(i);return String::Cref(*this,i);}

inline char String::operator[](int i)const
{check(i);return rep->s[i];}
}
int main()
{

smr::String s="smr";
s[0]='d';

return 0;
}
在我的机器上是没问题的,不知道你的是怎么回事了


Go confidently in the  directions of your dreams,live the life you have imagined!Just do it!
It is no use learning without thinking!
2007-09-18 13:32
rediums
Rank: 2
等 级:新手上路
威 望:3
帖 子:367
专家分:0
注 册:2007-7-29
收藏
得分:0 

我的也可以了,只要把这几个函数改为非在线函数:

Cref operator[](int i);
char read(int i)const;
void write(int i,char c);

如果不改的话,单独编译string类是可以通过的,但是加入了main以后就会提示下面错误:

无法解析的外部符号 "public: class smr::String::Cref __thiscall smr::String::operator[](int)"
无法解析的外部符号 "public: void __thiscall smr::String::write(int,char)"

谢谢yuyunliuhen了!!


2007-09-18 13:47
快速回复:求助:关于c++程序设计语言(特别版)上的问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029959 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved