当我用Turbo C ++编写这个程序时,它运行正常。但是,当我在CodeBlocks,Xcode中写入时,我收到有关char
的错误,我不知道为什么。我想我可以声明像char* name
这样的东西用作字符串。
这个程序是关于多级继承的。将利率和期间传递给函数,它将根据账户类型显示输出。
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
class banktype1{
public:
char *accountType;
float interestAmt,depositAmt,period,totalAmt;
public:
void interestCal(char *x,int y,int z){
accountType=&x;
depositAmt=y;
period=z;
if(accountType=="A")
interestAmt=depositAmt*0.5*period;
else if(accountType=="B")
interestAmt=depositAmt*0.15*period;
else if(accountType=="C")
interestAmt=depositAmt*0.25*period;
}
};
class banktype2:public banktype1{
public:
void displayData(){
cout<<interestAmt<<"\n"<<depositAmt<<endl;
cout<<"Total"<<interestAmt+depositAmt;
}
};
class banktype3:public banktype2{
};
int main(){
banktype3 b1;
b1.interestCal("A",1000,12);
b1.interestCal("B",1000,12);
b1.interestCal("C",1000,12);
b1.displayData();
return 0;
}
在调用函数的地方,我收到了这个通知:
不推荐使用从字符串文字到char *的转换。
也在我得到的条件的地方:
未指定与字符串文字进行比较的结果(改为使用strncmp)
答案 0 :(得分:2)
使用std::string
代替旧的C字符串,这些字符串只是字符数组。
请注意,在C字符串的情况下,相等运算符只是比较数组的地址,但在std::string
的情况下,它会重载以进行字符串比较。 (所以你的elseif代码应该使用std::string
)。
另请注意,使用C字符串时,您应使用const char*
,而不是char*
。
解决方案很简单(并记住它是一个很好的经验法则):除了极少数情况下它的必要性,总是使用C ++特性而不是C等价,在这种情况下只需使用{ {1}}。它的设计使你的生活更轻松。
答案 1 :(得分:1)
C ++中的字符串文字具有常量字符数的类型。
但无论如何都是函数定义
void interestCal(char *x,int y,int z){
accountType=&x;
depositAmt=y;
period=z;
if(accountType=="A"){
interestAmt=depositAmt*0.5*period;
}else if(accountType=="B"){
interestAmt=depositAmt*0.05*period;
}else if(accountType=="C"){
interestAmt=depositAmt*0.05*period;
}
}
错了。
如果您将字符串文字作为参数传递给函数,编译器会警告第一个参数应该具有类型const char *
。
本声明
accountType=&x;
无效。右操作数&x
具有类型char **
,而左操作数具有类型
char *
因为accountType声明为
char *accountType;
此
if(accountType=="A"){
和其他if else语句也无效。在这里,您正在尝试比较指针。
如果将accountType定义为
,则会更简单,更正确char accountType;
并且该函数看起来像
void interestCal( char x, int y, int z )
{
accountType = x;
depositAmt = y;
period = z;
if ( accountType == 'A' )
{
interestAmt = depositAmt * 0.5 * period;
}
else if ( accountType == 'B' )
{
interestAmt = depositAmt * 0.05 * period;
}
else if( accountType == 'C' )
{
interestAmt = depositAmt * 0.05 * period;
}
}
它将从main调用
b1.interestCal( 'A', 1000, 12 );
b1.interestCal( 'B', 1000, 12 );
b1.interestCal( 'C', 1000, 12 );
此外,如果三个if-else语句确实具有相同的复合语句,则可以将它们重写为一个if语句
if ( accountType == 'A' || accountType == 'B' || accountType == 'C')
{
interestAmt = depositAmt * 0.05 * period;
}
答案 2 :(得分:-1)
啊它工作了。根据答案做出一些改变之后。删除const
。并将if(accountType ==&#39; A&#39;)更改为if(* accountType ==&#39; A&#39;)
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
class banktype1{
public:
char *accountType;
float interestAmt,depositAmt,period,totalAmt;
public:
void interestCal(char x,int y,int z){
accountType=&x;
depositAmt=y;
period=z;
if(*accountType=='A'){
interestAmt=depositAmt*0.5*period;
}else if(*accountType=='B'){
interestAmt=depositAmt*0.05*period;
}else if(*accountType=='C'){
interestAmt=depositAmt*0.05*period;
}
}
};
class banktype2:public banktype1{
public:
void displayData(){
cout<<interestAmt<<"\n"<<depositAmt<<endl;
cout<<"Total"<<interestAmt+depositAmt;
}
};
class banktype3:public banktype2{
};
int main(){
banktype3 b1;
b1.interestCal('A',1000,12);
b1.interestCal('B',1000,12);
b1.interestCal('C',1000,12);
b1.displayData();
return 0;
}