C ++ - 如何通过引用在函数中传递带指针的对象?

时间:2015-07-31 05:09:07

标签: c++ function pointers

如何将包含指针成员的对象传递给函数?我希望能够修改该对象成员并使main中的原始对象具有反映在其上的修改值,简单代码我只想知道如何执行此操作。我是新人。我使这段代码像我的代码一样简单,我尝试了一个重载的赋值运算符和一个复制构造函数,但仍然没有好处。有人可以向我解释当我调用函数set()时发生的过程;以及为什么我收到错误

我想使用set()函数将对象名称成员更改为另一个

#include <iostream>
#include <string>
using namespace std;

class student
{
public:
    void setName(string *nameVariable);
    void printName(){ cout << *name; }
private:
    string *name;
};

void student::setName(string *nameVariable)
{
    name = nameVariable;
}



void  set(student& student1);

int main()
{
    string *nameptr, name;//creates pointer and varible of type string
    nameptr = &name;//sets nameptr to the adress of name                
    *nameptr = "Nick";//inderict access, assigns what nameptr is pointing to the value"nick"        

    student student1;
    student1.setName(nameptr);
    student1.printName();//couts - Nick -

    set(student1);
    student1.printName();//should cout - Jorge - after modification however an error occurs
    cout << endl;
    system("pause");
}



void  set(student& rightStudent)
{
    string *nameptr, name;
    nameptr = &name;
    *nameptr = "Jorge";
    student localStudent;
    localStudent.setName(nameptr);

    rightStudent = localStudent;
}

1 个答案:

答案 0 :(得分:1)

主要问题是函数set返回后,student1指向悬空指针。在函数内部,rightStudent指向name的地址。一旦函数返回,该地址无效。因此,您看到了未定义的行为。

该计划非常脆弱。您正在存储指针,但只要对象(类型student)处于活动状态,就没有足够的逻辑来确保指针保持有效。

为简单起见,您应该在student中存储对象而不是指针。

class student
{
   public:
      void setName(string  const& nameVariable);
      void printName(){ cout << name; }
   private:
      string name;
};

更改后,程序的其余部分会变得更简单。

void student::setName(string const& nameVariable)
{
    name = nameVariable;
}

void  set(student& student1);

int main()
{
    string name = "Nick";

    student student1;
    student1.setName(name);
    student1.printName();

    set(student1);
    student1.printName();
    cout << endl;
    system("pause");
}

void  set(student& rightStudent)
{
    string name = "Jorge";
    rightStudent.setName(name);
}