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

问题描述 投票:-3回答:1

我有班级员工

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来更改值但我不知道如何启动。

c++
1个回答
0
投票

你可以做到这一点,但是因为你从来没有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,一切都应该使用成员函数来完成。

© www.soinside.com 2019 - 2024. All rights reserved.