C++ string 做返回类型

fengyiuqi 2009-03-12 02:39:54
------------------Func_ptr.h------------------------------------

#ifndef FUNC_PTR_H
#define FUNC_PTR_H

#ifndef FUNC_PTR_H
#define FUNC_PTR_H

int bigger( const int &a, const int &b );

double bigger( const double &a, const double &b );

std::string bigger( const std::string &a,const std::string &b );
//
//template<typename T>
//T bigger(const T &a, const T &b);

#endif FUNC_PTR_H

#endif FUNC_PTR_H

--------------------------Func_ptr.cpp--------------------------------------------
#include<iostream>
#include<string>
#include"Func_ptr.h"
int bigger( const int &a, const int &b )
{// retrun a if a >b or return b

if( a < b )
return b;
else
return a;

}

double bigger( const double &a, const double &b )
{// retrun a if a >b or return b


if( a < b )
return b;
else
return a;

}


std::string bigger( const std::string &a,const std::string &b )
{
return a;
}


-------------------------Main.cpp------------------------------------
#include<iostream>

#include"Func_ptr.h"



int main()
{

std::cout << bigger( 3, 10 ) << std::endl;

std::cout << bigger( 4.5, 10.0 ) << std::endl;

std::cout << bigger( 11.3, 1.6 ) << std::endl;

int (*funcPtr)( const int & , const int & ) = bigger;

double (*funcPtr_double)( const double &, const double &) = bigger;

std::cout << funcPtr( 11, 1 ) << std::endl;

std::cout << funcPtr_double( 11.5, 12.7 ) << std::endl;

return 1;
}

编译报错:(只是在添加了std::string bigger( const std::string &a,const std::string &b )才出现的 )

错误究竟在什么地方呢?

1>------ 已启动生成: 项目: Func_Ptr, 配置: Debug Win32 ------
1>正在编译...
1>Main.cpp
1>Func_ptr.cpp
1>.\Func_ptr.cpp(51) : fatal error C1004: 发现意外的文件尾
1>正在生成代码...
1>生成日志保存在“file://e:\vs\Func_Ptr\Func_Ptr\Debug\BuildLog.htm”
1>Func_Ptr - 1 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========
...全文
3981 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
ferry_passion 2009-12-18
  • 打赏
  • 举报
回复
似水流年__ 2009-12-18
  • 打赏
  • 举报
回复
也不清楚一些机制,我个人认为直接返回对象,想下内存的分配就知道是不对了
因为C++不像是Java或者C#,直接可以返回对象的
C++即使你声明一个对象,但变量保存的仍然是一个地址,所以就是返回的时候,指的那块内存在函数结束时已经回收了,除非用堆分配的
像CString RetStr()
{
CString s="aaaa";
return s;
}
虽然有时可以起作用,可以返回字符串,但仍然是不正确的,有时就不会起作用了,我曾有这种经历的

C++的对象返回方式采用和C的返回一样
void RetStr(CString &str)
{
//对str进行操作,实际上就是对外部使用模块的str的操作,此方法结束后,可以得到我想要的结果
}
whsfer 2009-03-19
  • 打赏
  • 举报
回复
应该返回string 类型的引用。
rgmlkthh 2009-03-19
  • 打赏
  • 举报
回复
我曾经也遇到过这样的错误,把 string改为 char *就可以了。
ysysbaobei 2009-03-19
  • 打赏
  • 举报
回复
Sco_field 2009-03-18
  • 打赏
  • 举报
回复
编译没有问题不代表程序就没有“错误”,像直接返回类对象本身就是一种不应该发生的行为,严格来说就是一种错误。
[Quote=引用 29 楼 mengde007 的回复:]
此题根本没错,我想LZ是故意考察此板块的人的动手吧。
[/Quote]
mengde007 2009-03-18
  • 打赏
  • 举报
回复
此题根本没错,我想LZ是故意考察此板块的人的动手吧。
tujunf 2009-03-18
  • 打赏
  • 举报
回复
楼上正解

一群人答非所问

源代码本身没有任何问题

#include "stdafx"
或去掉预编译选项
beyond071 2009-03-16
  • 打赏
  • 举报
回复
把楼主的代码拷到VS2008下运行 没有错误...
pengzhixi 2009-03-15
  • 打赏
  • 举报
回复
mark
hmt.sysfixer.net 2009-03-15
  • 打赏
  • 举报
回复
mark
P_ghost 2009-03-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]
C++不要把对象作为返回值,特别是string,CString,这些类型。
跨模块的时候相当危险。
[/Quote]

为什么呢?我对这方面一直很缺乏了解,希望能说明一下
wammw 2009-03-15
  • 打赏
  • 举报
回复
顶!
iambic 2009-03-15
  • 打赏
  • 举报
回复
C++这个垃圾语言。一个面向对象的语言竟然连对象都返回不了……
soft_jianbiao 2009-03-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 healer_kx 的回复:]
C++不要把对象作为返回值,特别是string,CString,这些类型。
跨模块的时候相当危险。
[/Quote]

请问,为设么会相当危险,可否举个形象的例子,小弟不怎么理解!
子然在打码 2009-03-15
  • 打赏
  • 举报
回复
学习了!!!
qq675927952 2009-03-14
  • 打赏
  • 举报
回复
又学习了
chin_chen 2009-03-14
  • 打赏
  • 举报
回复
up
RoseinTrap 2009-03-13
  • 打赏
  • 举报
回复
最好还是用参数的方式传字符串吧
「已注销」 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 healer_kx 的回复:]
返回字符串本身都是一件很危险的事情,
实在没想到,没有多少人回答这个问题。

在VC7和以后的版本中,是没有问题的,源于Allocator的实现问题。
也就是CRT的堆分配内存的问题。
[/Quote]

在VC7及以后版权,如果是MD/MDd编译(动态链接msvcrt库),则没有问题,因为共用一个CRT。
但MT/MTd(静态链接)是不行的。
此时只能使用shared_ptr指针返回。
加载更多回复(14)

65,211

社区成员

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

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