我将跟着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)?我真的很感激可以解决这个问题。
答案 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
对象使用该功能。这适用于传递指针以及对对象的引用。