如何让ben.get_name()
返回“Beniah”?以下是我的完整代码:
#include <iostream>
#include <string>
using namespace std;
class Worker;
class Person{
public:
Person(int Age, Worker worker){
age = Age;
name = worker.get_name();
}
string get_name(){
return name;
}
private:
int age;
string name;
};
class Worker{
public:
Worker(string Level, string Name){
level = Level;
name = Name;
}
string get_name(){
return name;
}
private:
string level;
string name;
};
int main(){
Worker worker1 = Worker("base", "Beniah");
Person ben = Person(27, worker1);
cout << ben.get_name();
return 0;
}
2条答案
按热度按时间ukdjmx9f1#
这是使用继承实际上有意义的罕见情况之一:
通过使用公共继承,我们Assert
Worker
是Person
--或者更准确地说,在任何我们想要Person
的情况下,总有人可以用Worker
代替。通过使用继承来Assert
Worker
是Person
,我们已经确保了我们为Person
定义的所有操作也为Worker
定义,包括在Worker
对象上调用Person::get_name
,即使get_name
只在Person
中定义,而不是直接在Worker
中定义。继承肯定有一些缺点,所以在做出任何不可撤销的决定之前,您可能需要仔细检查它。
在任何情况下,如果你想为
Worker
添加一个接受Person
和level
的构造函数,你也可以很容易地完成。或者你可以(例如)在Worker
中创建一个名为hire
的静态成员函数,它将接受一个Person
并创建一个Worker
:这确实有一些人们可能不喜欢的影响,特别是在哲学层面上。例如,每次你
hire
一个Person
,你都在创建一个包含Person
的Worker
对象,所以你可以说,当你雇用某人时,他们是一个全新的人,从现有的Person
复制而来,而不是实际上是现有的Person
。有些时候/情况下,这可能是一个问题(和其他地方,它不是)。4bbkushb2#
当你声明一个类的示例时,类的定义必须是已知的。如果不是,则只能使用指向类示例的指针或引用。
在这里,您只需在
Person
之前定义Worker
。顺便说一句,当一个ref就足够了的时候,你不应该传递一个Worker对象的副本,或者如果你声明了
const
方法(它实际上是什么),最好是一个const ref。你的代码可以变成:
或者,如果您有循环依赖项,您可以推迟实际使用
Worker
类的方法的定义。下面是对原始代码的最小更改,只是推迟了构造函数的定义: