(C++) 字符串文本与参数列表不匹配



我正在关注托尼·加迪斯(Tony Gaddis(C++的书,名为"从C++开始:从控制结构到对象"。

有一个编程示例,我遇到了错误。该程序为一个接受两个参数的类创建一个构造函数。这两个参数是指向字符的指针。这是课程的一部分:

class ContactInfo
{
private:
    char *name;
    char *phone;
public:
    ContactInfo(char *n, char *p)
    {
        name = new char[strlen(n) + 1];
        phone = new char[strlen(p) + 1];
        strcpy(name, n);
        strcpy(phone, p);
    }
}

创建 ContactInfo 类的对象时,程序将这些值传递给构造函数。

ContactInfo entry("Kristen Lee", "555-2021");

这一切对我来说似乎都很有意义,但是在将"Kristen Lee"传递给构造函数时出现错误。错误说:

"没有构造函数"ContactInfo::ContactInfo"的实例与参数列表匹配。参数类型为:(常量字符[12],常量字符[9](">

我不明白为什么会出现此错误。我唯一能想到的是,我们试图将一个值传递给一个保存内存地址的变量。但是,我对编程的了解还不够多,不知道是否是这种情况。如果它根本不起作用,我怀疑这是否会在教科书中。也许这是一个视觉工作室问题(我正在使用的IDE(?我真的很感激能得到这个问题的任何帮助。

字符串文字(例如 "Kristen Lee"(是一个const char*:它不能被你的程序修改。由于ContactInfo的构造函数只需要一个char*,字符串文字不匹配。

这在编译器消息中列出:

构造函数"ContactInfo::ContactInfo"的实例与参数列表不匹配。参数类型为:(常量字符[12],常量字符[9](

在这里,编译器告诉您函数ContactInfo::ContactInfo不匹配,并且您传递的参数const char[12]const char[9]

您的问题可以通过改用std::string轻松解决:

#include <string>
class ContactInfo
{
private:
    std::string name;
    std::string phone;
public:
    ContactInfo(std::string n, std::string p) : name{n}, phone{p}
    {}
};

请注意,这使您的代码变得多么简单,因为您不再需要 4 行代码并管理自己的内存。

字符串文字可以衰减为char const*,而不是char*。因此,您应该更改构造函数以使用 char const*

ContactInfo(char const* n, char const* p) { ... }

作为一般原则,除非你想让函数修改它的参数,否则让它const。这总是一个更好的选择。它允许使用const对象和非const对象来使用该函数。这适用于传递指针以及对对象的引用。

最新更新