char使用指针传递函数

时间:2014-04-04 16:34:46

标签: c++ oop pointers char turbo-c++

当我用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)

3 个答案:

答案 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;
}