gpt4 book ai didi

c++ - 在类的函数中创建字符串时出错

转载 作者:行者123 更新时间:2023-11-28 05:24:10 24 4
gpt4 key购买 nike

我私下创建了一个名为 Employee 的类,我有一个 Name 作为 string 。这是我的类(class)声明:

class Employee
{
string Name;
public:
Employee();
void SetName(string);
void StringToEmployee(string);
~Employee();
}

这是 StringToEmployee(string) 方法的定义:

void Employee::StringToEmployee(string s)
{
char *first = s, *end = s+strlen(s), *last = NULL;
last = find(first, end, ',');
string temp(first, last- first);
SetName(temp);
}

当我调试到 string temp(first, last-first) 行时出现错误,似乎编译器不允许我在方法中构造新的字符串。因为我也更改为 string temp; 然后是 temp.assign(first, last-first)。错误仍然存​​在。如何在方法中创建新字符串?

最佳答案

您应该使用迭代器并利用标准库的特性,而不是原始指针和 C 风格的字符串函数。这不仅会让您的 C++ 代码更地道、更容易理解,而且还会隐式地解决您的许多错误。

首先,StringToEmployee的实现应该改写如下:

void Employee::StringToEmployee(std::string s)
{
const std::string temp(s.begin(),
std::find(s.begin(), s.end(), ',');
SetName(temp);
}

但由于您没有修改 s 参数并且不需要它的拷贝,您应该通过常量引用传递它:

void Employee::StringToEmployee(const std::string& s)
{
const std::string temp(s.begin(),
std::find(s.begin(), s.end(), ',');
SetName(temp);
}

另外,您应该考虑重新设计您的 Employee 类。目前,您有一个创建无效 Employee 对象的默认构造函数,然后您有成员函数允许您通过设置其成员。相反,您可以使用一个构造函数一步完成所有这些初始化工作。您的代码不仅会更清晰、更容易理解,而且会更高效!

也许是这样的:

class Employee
{
std::string Name; // name of this employee

public:
Employee(const std::string& name); // create Employee with specified name
void SetName(const std::string& newName); // change this employee's name
~Employee();
};



Employee::Employee(const std::string& name)
: Name(s.begin(), std::find(s.begin(), s.end(), ','))
{ }

void Employee::SetName(const std::string& newName)
{
Name = std::string(s.begin(), std::find(s.begin(), s.end(), ','));
}

Employee::~Employee()
{ }

几个简短的笔记:

  • 您会看到,每当我使用标准库命名空间中的类时,我总是显式写出 std::。这是一个很好的养成习惯,多输入 5 个字符并不难。这一点特别重要,因为 using namespace std;a really bad habit to get into .
  • 我通过常量引用传递不需要修改的对象(如字符串)或在方法内部有一个拷贝。这既更容易推理,也可能更有效(因为它避免了不必要的复制)。
  • 在构造函数内部,我使用了看起来很有趣的语法,包括一个冒号和一些圆括号。这称为 member initialization list ,这是您应该习惯看到的东西。这是类的构造函数初始化其成员变量的标准方法。

关于c++ - 在类的函数中创建字符串时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40888948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com