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

时间:2018-08-09 04:20:51

标签: c++ class constructor char arguments

我将跟着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”的实例与参数列表匹配。参数类型为:(const char [12],const char [9])”

我不明白为什么会出现此错误。我唯一能想到的是,我们正在尝试将值传递到保存内存地址的变量中。但是,我对编程知识还不够了解,是否确实如此。我怀疑如果这根本不起作用的话,这将在教科书中。也许是视觉工作室的问题(我正在使用的IDE)?我真的很感激可以解决这个问题。

2 个答案:

答案 0 :(得分:1)

字符串文字(例如"Kristen Lee")是const char*:您的程序无法对其进行修改。由于ContactInfo的构造函数仅使用char*,因此字符串文字不匹配。

这在编译器消息中列出:

  

没有构造函数“ ContactInfo :: ContactInfo”的实例与参数列表匹配。 参数类型为:(const char [12],const char [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行代码并管理自己的内存。

答案 1 :(得分:0)

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

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

作为一般原则,除非您希望函数修改其参数,否则请将其设为const。那总是一个更好的选择。它允许通过const对象和非const对象使用该功能。这适用于传递指针以及对对象的引用。