【问题标题】:Getting warning "deprecated conversion from string constant to char*. Why am I getting the warnings?收到警告“不推荐使用从字符串常量到 char* 的转换。为什么我会收到警告?
【发布时间】:2023-03-16 06:56:01
【问题描述】:

我是 C++ 的初学者。我正在研究继承。我已经编写了一个代码并编译了它,它似乎工作正常,我得到了预期的输出。但是当我编译它时,我收到了 13 个类似的警告。我不确定是什么问题?如何覆盖这些警告?这是我的代码:

#include <iostream>
#include <string.h>

using namespace std;
class Identity
{
protected:
    char *name;
    int dob;
    char* blood_group;

    Identity(char *iname="", int nlength=1, int idob=0, char *iblood_group="", int blength=2):dob(idob)
    {
        name = new char[nlength+1];
        strncpy(name,iname,nlength);
        name[nlength]='\0';

        blood_group = new char[blength+1];
        strncpy(blood_group,iblood_group,blength);
        blood_group[blength]='\0';
    }

    ~Identity()
    {
        delete[] name;
        delete[] blood_group;
    }
};

class Physical
{
protected:
    double height;
    double weight;

    Physical(double pheight = 0.0, double pweight = 0.0):height(pheight),weight(pweight)
    {
    }
};

class Registration
{
protected:
    int policy_number;
    char* contact_address;

    Registration(int p_num=0, char* addr="", int alength=1):policy_number(p_num)
    {
        contact_address = new char[alength+1];
        strncpy(contact_address,addr,alength);
        contact_address[alength] = '\0';
    }

    ~Registration()
    {
        delete[] contact_address;
    }
};

class Contact:public Identity, public Physical, public Registration
{
private:
    char* ph_number;
    char* driver_license;
public:
    Contact(char *name ="",int nlength=0,int dob = 0, char* blood = "", int blength = 0,double height = 0, double weight = 0, int pol_num = 0, char* cont_addr="", int alength=10, char *ph="",int plength=10,char* lic="",int llength=10):Identity(name,nlength,dob,blood,blength),Physical(height,weight), Registration(pol_num,cont_addr,alength), ph_number(ph),driver_license(lic)
    {
        ph_number = new char[plength+1];
        strncpy(ph_number,ph,plength);
        ph_number[plength] = '\0';

        driver_license = new char[llength+1];
        strncpy(driver_license,lic,llength);
        driver_license[llength] = '\0';
    }

    ~Contact()
    {
        delete[] ph_number;
        delete[] driver_license;
    }

    char* GetName()
    {
        return name;
    }

    int GetDob()
    {
        return dob;
    }

    char* GetBloodGroup()
    {
        return blood_group;
    }

    double GetHeight()
    {
        return height;
    }

    double GetWeight()
    {
        return weight;
    }

    int GetPolicyNum()
    {
        return policy_number;
    }

    char* GetAddress()
    {
        return contact_address;
    }

    char* GetPhoneNumber()
    {
        return ph_number;
    }

    char* GetDriverLicense()
    {
        return driver_license;
    }
};

int main()
{
    using namespace std;
    Contact kck("MyName",strlen("MyName"),11111111,"A+",strlen("A+"),15.10,651.5,1111,"MyArea",strlen("MyArea"),"1111111111", strlen("1111111111"),"ABCD1234",strlen("ABCD1234"));

    cout << kck.GetName() << endl;
    cout << kck.GetDob() << endl;
    cout << kck.GetBloodGroup() << endl;
    cout << kck.GetHeight() << endl;
    cout << kck.GetWeight() << endl;
    cout << kck.GetPolicyNum() << endl;
    cout << kck.GetAddress() << endl;
    cout << kck.GetPhoneNumber() << endl;
    cout << kck.GetDriverLicense() << endl;

return 0;
}

【问题讨论】:

  • 不要使用strncpy。它不会做你认为它会做的事情。仔细阅读它的文档,想想当被复制的字符串长于可用空间时的结果。

标签: c++ function class inheritance multiple-inheritance


【解决方案1】:

在很多地方你会写这样的东西:

char *name = ""

但是,"" 具有类型 const char[1] 。这隐式转换为const char *。但随后您尝试将其分配给char *,这是试图忽略const 限定符。

从 C++11 开始,这是完全不允许的。在 C++11 之前,这是允许但已弃用的。编译器警告你这是个坏主意。

如果你真的必须使用指针,那么在任何可能指向字符串字面量的情况下使用char const *

但是完全避免使用指针会更好,因为它们会使您的代码复杂化并引入错误的机会,如果您不使用指针就不会出现错误。将字符串的长度与字符串分开传递是非常糟糕的。

例如,使用string 来保存所有字符串。作为初学者,最好从最简单的技术开始,巧合的是,这也是最好的技术。到目前为止,您编写程序的方式只是无缘无故地让自己过日子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2011-11-20
    • 2012-09-09
    • 1970-01-01
    • 2021-07-02
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多