-3

您好,我只是在学习 C++。我有这段代码,但是当我尝试从标题构建解决方案时出现错误。任何想法如何解决这个问题?

class cMan
{
public:
    cMan(char *chFirstName, char *chLastName, double dWeight, int iHeight);
    ~cMan();
    void vWriteMembersValues();

private:
    char chFirstName[5];
    char chLastName[5];
    double dWeight;
    int iHeight;
    
};

cMan::cMan(char *chFirstName, char *chLastName, double dWeight, int iHeight)
{
    for (int i = 0; i < 5; i++)
    {
        this->chFirstName[i] = chFirstName[i];
        this->chLastName[i] = chLastName[i];
    }
    
    this->dWeight = dWeight;
    this->iHeight = iHeight;
}

cMan::~cMan()
{
    delete this;
}

void cMan::vWriteMembersValues()
{
    for (int i = 0; i < 5; i++)
    {
        cout << this->chFirstName[i];
        
    }
    
    for (int i = 0; i < 5; i++)
    {
        cout << this->chLastName[i];
        
    }
    
    cout << " " << this->dWeight;
    cout << " " << this->iHeight;
    
}
int main()
{
    cMan cmI("Michal", "Stanko", 83.5, 200);
    
    cmI.vWriteMembersValues();
    
    cout << endl;
    
    cmI.~cMan();
    
    cin.get();
    cin.get();
    
    return 0;
}

我对编程知之甚少,但如果有人能尽可能简单地向我解释这一点,我会很高兴。

4

3 回答 3

4

字符串文字是const char[]数组,因此您需要更新cMan()构造函数以获取const char*指针而不是char*指针。否则,请std::string改用。

于 2022-03-04T21:20:02.400 回答
2

问题是const

尝试采取 aconst char *而不是 achar *

于 2022-03-04T21:12:20.647 回答
2

您正在调用构造函数

cMan cmI("Michal", "Stanko", 83.5, 200);

传递给它字符串文字。

在 C++ 中,与 C 字符串文字相对的是常量字符数组类型。用作参数表达式,它们被隐式转换为指向其类型的第一个字符的指针const char *

因此,如果您要使用字符串文字作为构造函数的参数,则将其声明为

cMan( const char *chFirstName, const char *chLastName, double dWeight, int iHeight);

请注意此声明中使用的字符串文字

cMan cmI("Michal", "Stanko", 83.5, 200);

有更多的字符然后类的相应初始化数据成员。

如果您将传递长度小于声明为数据成员的数组大小的字符串文字,则此循环

for (int i = 0; i < 5; i++)
{
    this->chFirstName[i] = chFirstName[i];
    this->chLastName[i] = chLastName[i];
}

当您尝试使用数据成员时,可能是未定义行为的原因。

因此,为了避免未定义的行为,最好将字符串存储在数据成员中。您可以将数据成员声明为具有 typestd::string而不是 type char[5]

于 2022-03-04T21:23:36.913 回答