问些问题,顶者有分

ectt0923 2006-08-10 01:27:30
以下都在标准C++(stl)下:
1, const char*
char *
与string 的区别

2.exit(1);与
return;
区别

3.vector <string> vec;

这里vec的 初值是什么
vector<string>::iterator it;
it=vec.begin();
int i=vec[0];
这样看来iterator与整数i有什么区别吗

4.在类定义里含有:

public:
OneSent(string str);
void getRealNodes(const ParseNode* node,vector <ParseNode*> &realNodes);
Path getPath(ParseNode* node1,ParseNode* node2);
void getAllPaths(vector <ParseNode*> realNodes, vector<Path> &allPaths);


private:
ParseNode* rootNode;
实现如下:
void getReltoRoot(ParseNode* n,vector<string> &reltoRoot)
{

ParseNode* node=(ParseNode*) n;

while(node != rootNode){

}
}
却报错:testOndSent.cpp(53) : error C2065: 'rootNode' : undeclared identifier
在rootNode前加上this.
报错为 :
testOndSent.cpp(53) : error C2673: 'getReltoRoot' : global functions do not have 'this' pointers
testOndSent.cpp(53) : error C2228: left of '.rootNode' must have class/struct/union type
testOndSent.cpp(53) : fatal error C1903: unable to recover from previous error(s); stopping compilation

请问:rootNode 在类定义中已经含有了,为什么找不到?
this,不可以这样用吗,应该怎么用呢 ?
...全文
187 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
ectt0923 2006-08-10
  • 打赏
  • 举报
回复
thank you, all!!
Eddie005 2006-08-10
  • 打赏
  • 举报
回复
顶顶~
睡在床板下_ 2006-08-10
  • 打赏
  • 举报
回复
为了分而来
lkpo 2006-08-10
  • 打赏
  • 举报
回复
不好意思
第三个问题也可以这样说:
vector<string>::iterator it;
it=vec.end()-1;
int i=vec.lentgh()-1;
那么it与i的 值相等吗?
------------
不相等,类型已经不同了

lkpo 2006-08-10
  • 打赏
  • 举报
回复
1, const char*
char *
与string 的区别

const char* 和char* 是C语法,srting是STL的容器
const char* 的值不可改变,而char*可以

2.exit(1);与
return;
区别
exit(1)退出程序
return 返回调用点

3.vector <string> vec;

这里vec的 初值是什么
vector<string>::iterator it;
it=vec.begin();
int i=vec[0];
这样看来iterator与整数i有什么区别吗

vector是个容器,vector<string> vec 是创建一个空容器
iterator是迭代器,你把它当指针理解也可以

4.在类定义里含有:

public:
OneSent(string str);
void getRealNodes(const ParseNode* node,vector <ParseNode*> &realNodes);
Path getPath(ParseNode* node1,ParseNode* node2);
void getAllPaths(vector <ParseNode*> realNodes, vector<Path> &allPaths);


private:
ParseNode* rootNode;
实现如下:
void 类名::getReltoRoot(ParseNode* n,vector<string> &reltoRoot)-->改
{

ParseNode* node=(ParseNode*) n;

while(node != rootNode){

}
}
你的类叫什么,类名就换为什么
在类的定义外定义成员函数很容易忘了在前面写类名
没有类名就是一个全局函数,而不是成员函数
所以会报错global functions do not have 'this' pointers
OOPhaisky 2006-08-10
  • 打赏
  • 举报
回复
1, const char*
char *
与string 的区别
------------------------------------------------
string在内部的确是用char *实现的,但是并不是简单的char *,而是使用了一些优化技术(如“引用记述”等等)。而且string提供了数据封装,对“字符串”这个概念进行了更好的抽象,他也提供了很多操作字符串的函数。确切地说,string并不是一个类,它是一个typedef,他的“真实身份”是标准库中的basic_string模板,所以可以让用户自定义内存分配方式,自定义字符类型等等(只要你愿意去做的话,当然了,这涉及到模板的相关技术)。
OOPhaisky 2006-08-10
  • 打赏
  • 举报
回复
public:
OneSent(string str);
void getRealNodes(const ParseNode* node,vector <ParseNode*> &realNodes);
Path getPath(ParseNode* node1,ParseNode* node2);
void getAllPaths(vector <ParseNode*> realNodes, vector<Path> &allPaths);


private:
ParseNode* rootNode;
实现如下:
void getReltoRoot(ParseNode* n,vector<string> &reltoRoot)
{

ParseNode* node=(ParseNode*) n;

while(node != rootNode){

}
}
----------------------------------------------------------------------
你这里的getReltoRoot并非“非静态成员函数”(确切地说,根本不是成员函数),怎么可以直接引用类成员rootNode呢?而且在非成员函数中更不可以使用this指针了,此指针只有在“非静态成员函数”中才可以使用。
ectt0923 2006-08-10
  • 打赏
  • 举报
回复
不好意思
第三个问题也可以这样说:
vector<string>::iterator it;
it=vec.end()-1;
int i=vec.lentgh()-1;
那么it与i的 值相等吗?
tidyduck 2006-08-10
  • 打赏
  • 举报
回复
const char*表示一个常量型字符串,char*是普通字符串,string为stl的字符串类
exit为退出程序,return是退出函数
int i=vec[0];不正确
believefym 2006-08-10
  • 打赏
  • 举报
回复
3。vec初值为空,理解为一个空的数组即可
vector<string>::iterator it;
it=vec.begin();
int i=vec[0];
这样看来iterator与整数i有什么区别吗
--------
这个代码iterator跟i有可比性吗?
前者是迭代器

4。
明显是你的定义出问题,你的代码也没说明那个函数是类的成员函数,加this也提示你global function。。。,说明这个只是一个全局函数而已
至少应该 void YourClass::getReltoRoot(ParseNode* n,vector<string> &reltoRoot)
云梦谭 2006-08-10
  • 打赏
  • 举报
回复
1, const char*
char *
与string 的区别
string 可以认为是STL的一部分,其元素可以用迭代器访问,char*是C风格的串

2.exit(1);与
return;
区别

exit(1);退出程序;return返回到调用点。

3.vector <string> vec;

这里vec的 初值是什么
vector<string>::iterator it;
it=vec.begin();
int i=vec[0];
这样看来iterator与整数i有什么区别吗
iterator是迭代器。begin()返回迭代器,vec[0]返回的则是容器的首元素。int i=vec[0];能通过吗?

4.
实现如下:
void getReltoRoot(ParseNode* n,vector<string> &reltoRoot)
这里没有域作用运算符,编译器认为这个函数是全局函数,而不认为是类成员,也就没有this指针,不能访问类成员了。改成
void classname::getReltoRoot(ParseNode* n,vector<string> &reltoRoot)


OOPhaisky 2006-08-10
  • 打赏
  • 举报
回复
3.vector <string> vec;

这里vec的 初值是什么
-------------------------
初始值为“空”。但是很可能编译器会为vec分配一定的内存空间,以备以后只用。
healer_kx 2006-08-10
  • 打赏
  • 举报
回复
顶有分
OOPhaisky 2006-08-10
  • 打赏
  • 举报
回复
更正:
说错了,return 0是正常返回,return 1表示异常返回。
OOPhaisky 2006-08-10
  • 打赏
  • 举报
回复
exit(1);与
return;
区别
--------------------------
exit(1)退出应用程序,返回状态“1”(代表程序正常结束);return这里楼主是指main函数中的return吧,从原则上来说,C++标准规定main函数不允许返回void,虽然有些编译器可以允许void main()这样的函数原型(比如vs),但是它是不符合标准的,符合标准的main函数原型为int main()或者int main(int argc, char **argv),所以main中的“return”确切得说是不正确的,而"return 1"表示程序正确结束。(但是对于支持void main的编译器而言,main中的return也就等价于return 1,即“正常返回”)
dx30611 2006-08-10
  • 打赏
  • 举报
回复
3.int i=vec[0];显然错了,类型不匹配,迭代器相当于一个类型指针
PMsg 2006-08-10
  • 打赏
  • 举报
回复
建议好好看看STL 容器部分
dx30611 2006-08-10
  • 打赏
  • 举报
回复
exit(1)表示终止进程,并向操作系统报告错误,一般来说0代表正常中止,其他的是非正常的
return只是一个函数返回空值而已.
dx30611 2006-08-10
  • 打赏
  • 举报
回复
1.string是c++下的定义标准容器,标准库中的算法可以通过其迭代器访问string对象,这是一种设计理念,而const char* 和char *属于语法的一部分,来源与c

64,282

社区成员

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

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