string中的c_str()的实现原理是怎样的?

jenpontan 2010-07-27 01:55:22
我在写一个线性表的类库,希望能将表中的数据转化成常量字符串const char *,这个类似string中的c_str()。
不知道其实现原理是如何?看类半天string源码都没看出头绪!
问题是这样的:

class A{
private:
char * datas;
int len;
public:
A(){
datas = new char[100];
len = 0;
}
~A(){delete [] datas;}
void add(char c){ // ...... }
const char * to_string(){
// ?????
}

怎样实现to_string()方法呢?使得在A a,释放后仍然能够使用to_string()返回的字符串常量!
我想过用static变量去存储它,在程序退出是自动释放static变量,但毕竟static变量是可以更改的,他不是常量,怎样将一个new出来的数据,转换成常量供以后使用呢?????
请高手指点!!
...全文
1234 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnlm2 2010-07-27
  • 打赏
  • 举报
回复
楼上大哥正解!
pengzhixi 2010-07-27
  • 打赏
  • 举报
回复
const _CharT*
c_str() const { return _M_data(); }


_CharT*
_M_data() const{ return _M_dataplus._M_p; }
pengzhixi 2010-07-27
  • 打赏
  • 举报
回复
嗯 有些实现是直接返回字符串指针的。
ZongShengLee 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 q616804668 的回复:]
C/C++ code


#include <iostream>
using namespace std;
class A
{
private:
char * datas;
int len;
public:
A(char *ch){
int num=strlen(ch);
datas=new char[num+1];……
[/Quote]


析构之后显然不能用了么。
ZongShengLee 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zhangweiit 的回复:]
“怎样将一个new出来的数据,转换成常量供以后使用呢?????”

那就是,放在类的static变量里面

同时,写一个static函数
static Data* getData()
{
if(s_pdata == null)
{
//构造data
}
return s_pdata;
}
[/Quote]


如果这样的话,每个对象的静态部分相同,某个改变之,其它全跟着变,还是和c_str()不一样的。
ayw215 2010-07-27
  • 打赏
  • 举报
回复
楼主说释放后仍然能够返回字符串
=========
是说重新返回一个新的字符串数组么?
Kevin_Perkins 2010-07-27
  • 打赏
  • 举报
回复
2楼的想法和我一样,返回字符串的首指针。但楼主说释放后仍然能够返回字符串,什么意思呢?难道说是把这段new出来的内存释放后也能取出字符串?
zhangweiit 2010-07-27
  • 打赏
  • 举报
回复
我上面那样做,不会变成常量,但是,你可以强制转换成常量
zhangweiit 2010-07-27
  • 打赏
  • 举报
回复
“怎样将一个new出来的数据,转换成常量供以后使用呢?????”

那就是,放在类的static变量里面

同时,写一个static函数
static Data* getData()
{
if(s_pdata == null)
{
//构造data
}
return s_pdata;
}

jenpontan 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 pengzhixi 的回复:]

自己分配内存保存这个字符串。
[/Quote]

那什么时候释放?
要使得程序退出时自动释放?能做到吗?
taodm 2010-07-27
  • 打赏
  • 举报
回复
倒,楼主一时人品好,竟然就试图守株待兔起来。

[Quote=引用 12 楼 jenpontan 的回复:]

各位兄弟辛苦啦!
我想要达到的效果就如果string类里面实现的c_str()。
可以看看string的c_str()的功能:
C/C++ code

#include <iostream>
#include <string>
using namespace std;
const char * get_cstr();
const char * get_cstr()
{
strin……
[/Quote]
pengzhixi 2010-07-27
  • 打赏
  • 举报
回复
自己分配内存保存这个字符串。
jenpontan 2010-07-27
  • 打赏
  • 举报
回复
各位兄弟辛苦啦!
我想要达到的效果就如果string类里面实现的c_str()。
可以看看string的c_str()的功能:

#include <iostream>
#include <string>
using namespace std;
const char * get_cstr();
const char * get_cstr()
{
string s = "Hello String !";
return s.c_str();
}
int main(int argc, char *argv[])
{
const char * cstr = get_cstr();
cout << cstr << endl;

string * s = new string("Test String !!");
const char * cs = s->c_str();
delete s;
cout << cs << endl;
return 0;
}

程序运行结果:
Hello String !
Test String !!

强大吧!!就是想要这样的效果,不知道怎样实现?
string对象释放后,c_str()返回的常量字符串仍然能够使用?
兄弟们有什么办法实现??
上善若水邻 2010-07-27
  • 打赏
  • 举报
回复


#include <iostream>
using namespace std;
class A
{
private:
char * datas;
int len;
public:
A(char *ch){
int num=strlen(ch);
datas=new char[num+1];
for(int i=0;i<5;i++)
{
datas[i]=ch[i];

}
datas[num]='\0';
len = 0;
}
~A(){delete []datas;}

const char * to_string(){
return datas;

}


};
int main()
{
A a("hello");
const char *p=a.to_string();
cout<<p<<endl;
return 0;
}



这里返回是常量字符 不知道这是不是你要的???
jackyjkchen 2010-07-27
  • 打赏
  • 举报
回复
string对于实现细节并没有规定,如果你愿意,直接强转内部data都不违反标准

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧