提问人:pandaero 提问时间:2/16/2023 更新时间:2/16/2023 访问量:43
如何在成员函数中访问具有匹配子成员名称的祖父级的成员?
How do you access a member from a grandparent in a member function with a matching child member name?
问:
我在课程设置中遇到了钻石问题。为简单起见:
class GrandParent
{
public:
...
protected:
std::string name;
int age;
};
class Parent1: virtual public GrandParent
{
public:
...
};
class Parent2: virtual public GrandParent
{
public:
...
};
class Child: public Parent1, public Parent2
{
public:
Child(void);
Child(const Child & other);
~Child(void);
Child & operator=(const Child & other);
private:
std::string name;
};
它们都具有规范的正统形式,以及一些额外的成员功能。
我的问题出现在类的复制分配运算符上:(需要帮助解决双 exlcamation 标记之间的内容!!Child
Child & Child::operator=(const Child & other)
{
std::cout << "Child Copy assignment operator called" << std::endl;
if (this != &other)
{
name = !!other.name!!;
GrandParent::name = !!other.name!!;
GrandParent::age = other.age;
}
return (*this);
}
如何正确区分这些?
答:
1赞
Sam Varshavchik
2/16/2023
#1
好吧,对于初学者来说,显示的代码不需要用户定义的赋值运算符。默认的会做正确的事情,所以:忘记整个事情。但是,据推测,必须有一个原因,因此手头的任务。
一个简单的方法是将每一步都传递给 C++ 编译器:
const GrandParent &other_grandparent=other;
GrandParent::name = other_grandparent.name;
当然,如果出于某种原因只需要用户定义的赋值运算符,但祖父级的默认赋值运算符可以完成这项工作,那么只需这样做:Child
GrandParent::operator=(other);
2赞
nielsen
2/16/2023
#2
根据我的理解,这个问题可以归结为:如何通过对象指针或引用来引用eclipse的成员变量。
答案是在引用变量时指定原始类:
Child & Child::operator=(const Child & other)
{
std::cout << "Child Copy assignment operator called" << std::endl;
if (this != &other)
{
name = other.Child::name; // or just other.name which refers to the Child "name"
GrandParent::name = other.GrandParent::name;
GrandParent::age = other.age;
}
return (*this);
}```
评论
Child(void);
不需要那里,这不是惯用的 C++。 同样。void
~Child(void);