C++ 通过指针更改 char* 类字段

c++ change char* class field by pointer

本文关键字:char 字段 指针 C++      更新时间:2023-10-16

我有类员工

class Employee
{
public:
char* Name;
char* Position;
int Age;
Employee (const char *_name, const char *_position, int _age)
{
Name = new char[strlen (_name) + 1];  
strcpy(Name, _name);
Position = new char[strlen (_position) + 1];
strcpy(Position, _position);
Age = _age;
};
~Employee ()
{
delete [] Name;
delete [] Position;   
};
}

我想更改字段的值 位置 按指针 员工* p.

int main(void){
Employee first("Josh", "secretary", 33);
Employee *p; 
p = &(first);
p->Position = "salesman";
}

是否可以以这种方式更改此值?我知道可以通过将 char* 更改为字符串来完成。我想我应该使用类运算符"->"或"="然后调整 char* 文件的大小并使用 strcpy 来更改值,但我不知道如何开始。

你可以这样做,但你会导致内存泄漏,因为你从来没有delete旧的Position。此外,由于析构函数delete[] Position;,这将导致未定义的行为,因为Position的值不再是动态分配的指针。

你应该提供一个成员函数来设置位置,然后它可以先释放之前的位置,并将新字符串复制到使用new创建的动态内存中。

void Employee::setPosition(const char *new_position) {
delete[] Position;
Position = new char[strlen (new_position) + 1];
strcpy(Position, new_position);
}

如果你不想要一个新的成员函数,你必须在调用者中执行此操作:

delete[] p->Position;
p->Position = new char[sizeof "salesman" + 1];
strcpy(p->Position, "salesman");

不过,这将是一个糟糕的设计。使用类的目的是隐藏所有这些实现细节。理想情况下,像Position这样的属性应该是private成员,而不是public,并且一切都应该使用成员函数完成。