我正在关注托尼·加迪斯(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
对象来使用该函数。这适用于传递指针以及对对象的引用。