注册 登录
编程论坛 C++教室

求助关于string的问题

windyfzz 发布于 2010-07-30 09:55, 2527 次点击
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
struct Monster
{
    char* name;   //为什么这行改为 string name;程序就通不过呢。如果非得用string name;后面的应该怎么改呢
    int power;
    int agile;

}mon;

void monster()
{
    Monster mon[3]={"野猴",45,50,"山猪",43,43,"老虎",32,49};
    int i;
    for(i=0;i<3;i++)
    {
        cout<<mon[i].name<<mon[i].power<<mon[i].agile<<endl;
    }
}
int main()
{
    monster();
    system("PAUSE");
    return 0;
}
28 回复
#2
xxlovemf2010-07-30 10:42
j[num] 和 num[j]在编译器看来都是一样的
寻址方式都是基址变址寻址,木有区别
#3
mxs8102010-07-30 11:19
以下是引用windyfzz在2010-7-30 09:55:24的发言:

struct Monster
{
    char* name;   //为什么这行改为 string name;程序就通不过呢。如果非得用string name;后面的应该怎么改呢
    int power;
    int agile;

}mon;
不知道你说的通不过是什么意思呢?
std::string name 试试
#4
gq1987182010-07-30 13:10
可以通过吧
#5
gq1987182010-07-30 13:13
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
struct Monster
{
    //char* name;  
    //为什么这行改为 string name;程序就通不过呢。如果非得用string name;后面的应该怎么改呢
    string name;
    int power;
    int agile;

}mon;

void monster()
{
    Monster mon[3]={"野猴",45,50,"山猪",43,43,"老虎",32,49};
    int i;
    for(i=0;i<3;i++)
    {
        cout<<mon[i].name<<mon[i].power<<mon[i].agile<<endl;
    }
}
int main()
{
    monster();
    system("PAUSE");
    return 0;
}
完全可以通过
#6
xiaobaidang2010-07-30 15:02
在c++中建议你不要使用结构体,最好使用类,类是c++的灵魂所在。可以定义构造函数的方式初始化。程序如下
#include <iostream>
#include <string>
using namespace std;

class Monster
{
public:
    Monster(string ,int ,int );

private:
    string name;
    int  power;
    int  agile;
};

Monster::Monster(string nam, int p,int a)
{
    name=nam;
    power=p;
    agile=a;
    cout<<name<<"   "<<power<<"  "<<agile<<endl;
}



int main()
{
    Monster mon[3]={Monster("monkey",45,50),Monster("tiger",43,43),Monster("mouse",32,49)};
    return 0;
}
#7
windyfzz2010-07-30 15:22
回复 5楼 gq198718
不会把,为什么我的VC就通不过呢。错误如下
error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : fatal error C1903: unable to recover from previous error(s); stopping compilation
执行 cl.exe 时出错.
#8
windyfzz2010-07-30 15:23
回复 3楼 mxs810
就是编译时会报错,错误如下
error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : error C2440: 'initializing' : cannot convert from 'const int' to 'struct Monster'
        No constructor could take the source type, or constructor overload resolution was ambiguous
c:\documents and settings\owner.legend-jh4xyv6s\桌面\cpp1.cpp(17) : fatal error C1903: unable to recover from previous error(s); stopping compilation
执行 cl.exe 时出错.
#9
gq1987182010-07-30 15:29
我在VS2008里面调试的 程序没问题呢
只有本站会员才能查看附件,请 登录
#10
gq1987182010-07-30 15:29
那是结果
#11
windyfzz2010-07-30 15:33
回复 9楼 gq198718
你把char* name 改为 string name了吗
#12
gq1987182010-07-30 16:56
嗯  改了
#13
gq1987182010-07-30 16:58
程序代码:
#include<iostream>
#include<stdlib.h>
#include<string>
using namespace std;
struct Monster
{
    //char* name;
   
//为什么这行改为 string name;程序就通不过呢。如果非得用string name;后面的应该怎么改呢
    string name;
    int power;
    int agile;

}mon;

void monster()
{
    Monster mon[3]={"野猴",45,50,"山猪",43,43,"老虎",32,49};
    int i;
    for(i=0;i<3;i++)
    {
        cout<<mon[i].name<<mon[i].power<<mon[i].agile<<endl;
    }
}
int main()
{
    monster();
    system("PAUSE");
    return 0;
}
的确没问题
#14
windyfzz2010-07-30 17:50
回复 13楼 gq198718
我用的是VC6.0,为什么我的会报错?错误我在上页以给出。
#15
pangding2010-07-31 01:28
Monster mon[3]={"野猴",45,50,"山猪",43,43,"老虎",32,49};
把的错误就是说这句过不了。
它读不懂这个,总想把每个逗号的东西都变成 Monster,但又说没有构造函数能干这个,所以报错的。
 
你可以试试这样:
Monster mon[3]={{"野猴",45,50},{"山猪",43,43},{"老虎",32,49}};
#16
pangding2010-07-31 01:30
vc6.0 相对“傻”一点,很不符合标准,BUG 也比较多。不能和后续的各种版本比。
#17
windyfzz2010-07-31 09:29
回复 15楼 pangding
这种方法也试了,也不行!
#18
windyfzz2010-07-31 09:29
回复 16楼 pangding
那你们一般用什么编译软件?
#19
zgxyz20082010-07-31 09:32
VS2008下调试木有问题.....
#20
tianxiao1102010-08-01 16:23
我在devC++ 运行也没问题, 但是在vc6.0 就不行了。
#21
pangding2010-08-02 01:36
这其实是数组初始化語法和结构初始化语法的混合。
数组初始化是指定义数组的时候,如果愿意,可以给元素赋初值。語法怎么写大家肯定都会。
结构初始化是定义一个结构的时候,可以给结构中的每个成员赋初值,語法的样子和数组的很像。

这个问题就是“定义一个结构数组的时候能初始化吗?”
按照规则推就应该可以,写法就应该是 struct type_t array[n] = { {.., .., .., ..}, {.., .., .., ...}, ... }; 的样子。
我没查,不知道标准是不是明确声明过结构数组可以这样初始化。不过一般的编译器应该支持这种写法。

vc 6.0 对标准支持的差劲是公认的,很多相对复杂一些的語法特征(比如上面说的那两种赋值語法的混合,但我其实觉得这好像不太复杂),它都不支持或者做的和标准要求的有出入。比较明显的是类模版中相对复杂的多的特性。那里的語法和上面那两个比确实混乱得多,vc6.0 对复杂的类模版特性支持好像是很差的。在 vs 的后续版本里,这个现像有明显的改观。

VC 6.0 中如果不行就是说它不支持,通过不了这种声明。认为是 vc 的一个 bug 也可以。
另一个很知名的 bug 好像是 vc6.0 里 string 类的 getline 函数的两次回车 bug。以前论坛里有几个人问过这问题,我当时答过几次了。希望不会再有人问了,后来我又看过一些人问,开始几次我把以前帖子的链接给过去过,不过后来还 偶尔会看到有人问,那个帖子我都找不着了,有时也懒的回答了(不过最近确实没看见有人问过了)。

大家除了利用论坛以外,还应该利用其它的一些网络工具。有时自己动手解决问题比上来问一问学得多。当然,问问题可以让更多人学到东西也是很好的了。不过应 该先自己尝试解决一下,查查资料什么的。有时问题解决了,把资料发上来也可以。要有自己心得的,要原创的,要精炼的!不用花太多时间,别人看完就能学到东 西的,正所谓简约不简单。我觉得心得都是这样的。如果发的东西确实有价值,版主很可能会加精的。

嘿嘿,由于版主置顶了这个帖子,我就囉唆两句~~
#22
yzhu2010-08-03 13:06
也许你的VC编译器出毛病了!
  是不是盗版的?
#23
pangding2010-08-03 15:11
盗版应该不可能把功能篡改的这么巧妙~~
#24
saynotolx2010-08-07 10:58
回复 楼主 windyfzz
可以通过的 没的问题
#25
jiakai04192010-08-08 01:40
因为VC6.0是在   IOS标准C++产生之前的编译器。
所以不支持很多的东西。也就是标准。
#26
honesty20082010-08-08 18:03
我用三种编译器都可以编译、运行啊
#27
towhee2010-08-09 10:29
之前也是用vc 6.0 从去年开始就装vs2005了,感觉确实大不一样
#28
我2010的天空2010-08-09 11:12
两个无论哪种都能达到想要的想要!还有你怎么没用类啊啊?那更方便!!试一试!
#29
txh20022010-08-11 11:50
string name  vc6下编译通不过,
C:\test.cpp(15) : error C2440: 'initializing' : cannot convert from 'char [5]' to 'struct Monster'

我也喜欢用类,不用struct

请高手解答
1