我有班级员工
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;
};
}
我想通过指针Employee * p更改字段位置的值。
int main(void){
Employee first("Josh", "secretary", 33);
Employee *p;
p = &(first);
p->Position = "salesman";
}
有可能以这种方式改变这个价值吗?我知道可以通过将char *更改为string来完成。我想我应该使用类运算符' - >'或'='a然后调整大小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
,一切都应该使用成员函数来完成。