我是C ++的新手。我正在尝试运行以下代码,希望得到
姓名:马修
接待员:约翰
然而,它给了我:
姓名:马修
接待员:没人
我认为通过在r
函数中将指针receptionist
设置为set_receptionist(Employee* r)
,我将receptionist
指针指向Employee
对象,这也是r
。
所以,通过使用箭头操作符,我认为我可以访问接待员指向的Employee
对象的成员函数。
如果我的理解错误,请纠正我。并教我如何修复此代码以获得我想要的结果。
#include <iostream>
#include <string>
using namespace std;
class Employee
{
public:
string getName();
void setName(string);
private:
string name;
};
string Employee::getName()
{
return name;
}
void Employee::setName(string x)
{
name = x;
}
class Department
{
public:
Department(string);
void set_receptionist(Employee*);
void print();
private:
string name;
Employee* receptionist;
};
Department::Department(string a)
{
name = a;
receptionist = NULL;
}
void Department::set_receptionist(Employee* r)
{
receptionist = r;
}
void Department::print()
{
cout << "Name: " << name << "\nReceptionist: ";
if (receptionist == NULL)
cout << "none";
else
cout << receptionist->getName();
cout << "\n";
}
int main()
{
Employee e;
e.setName("John");
Department d("Matthew");
d.print();
return 0;
}
答案 0 :(得分:2)
您实际上从未调用Department::set_receptionist
方法。因此,receptionist
在NULL
构造函数中以Department
开头,当您致电NULL
时,它仍为Department::print
。
Employee john;
john.setName("John");
Department d("Matthew");
d.set_receptionist(&john);
d.print();
要回答您的评论,指针是一种可以将地址存储到另一个变量的类型。这正是指针的意思。指针是指向其他变量的变量。告诉指针指向何处的方法是为该指针指定一个地址。
所以当你说出以下内容时:
Employee john;
Employee *pointer = &john;
变量pointer
现在通过存储其地址指向变量john
。您可以“取消引用”指针以获取原始指向变量,在本例中为john
。所以说pointer->setName("Bob");
就像说john.setName("Bob");
,除非你现在通过指针做这件事。重要的是要意识到*pointer
不是john
的副本,但实际上引用了与john
相同的内存位置。因此,您通过*pointer
进行的任何修改都会直接应用于john
,并会在john
中显示。
此图表可以帮助您直观地理解指针和变量之间的关系: