关于下面的代码,我有3个问题:
class cb
{
public:
int y_;
class iterator
{
public:
//void func() { y_ = 5; } // (1)
private:
int x_;
//cb a; // (2)
};
void funcCB() { }
};
class Human
{
public:
void func() const {
cb c; // (3)
c.funcCB();
}
// (4)
};1-为什么我不能在内部类中使用外部类的成员变量y_,如(1)所示?
2-为什么我不能像(2)中那样从内部类内部的外部类创建对象,但我只能创建指针和引用?
3-为什么如果我将(3) cb c;的代码行移动到(4)的代码行,我会得到编译错误?
发布于 2019-02-01 06:56:50
如果我不太明白这一点,请原谅--我的C++有点生疏了。
关于问题(1) --您尝试过"this“关键字吗?
例如,:
void func() { this->y_ = 5; } 下面是一个与您的几乎相同的示例:
对于问题2,您要求递归包含一个对象。这就像是在说,什么是洋葱?这是一个含有洋葱的皮。嗯,里面的洋葱也是一个包含洋葱的Peel,然后是Peel,然后是洋葱,等等。如果没有某种暂停的机制( Onion可能是Core,它什么都不包含),Onion对象的第一个实例化将无限循环,直到所有内存用完。
作为参考,内存只能在需要时检索,而不能在需要之前检索。
对于问题3,我采取了懒惰的方式,我说,这只是规则。
更新:我现在不在工作,所以我有更多的时间做一些更多的研究。正如我已经说过的,我的C++有点生疏了。
从本质上讲,对于Q1,您要做的是从类"iterator“访问类"cb”的成员。我的研究表明,仅仅因为"iterator“是"cb”的子类,它就不会获得任何特殊的访问权限。因此,您不能从“迭代器”访问"cb::y_“,也不能使用"this->y_”。类中的方法(函数)可以直接访问"y_“。子类不能。
注意以下成功编译的代码:
class cb {
public:
int y_;
class iterator {
public:
void func() {
cb *z = new cb();
z->y_ = 5;
} // (1)
private:
int x_;
cb *a; // (2)
};
void funcCB() { }
};
class Human
{
public:
void func() const {
cb c; // (3)
c.funcCB();
}
// (4)
cb *z;
};这可能不是你想要实现的目标,但我希望你想做的事情不能按你想要的方式完成。最好的办法是将“迭代器”实现为与"cb“不同的自己的类,并使其成为"cb”的"friend“类。或者更好、更简单的方法是在类中包含一组迭代器方法。这些方法将拥有对所有类属性的完全访问权限。
还要注意指向"cb“的指针引用。它不会编译为子类中的直接对象实例化。又一次,洋葱问题。
顺便说一句,记住C++不是Pascal。这不是Java。它可以执行子类,但正如您所看到的,它做得不是很好,或者至少它不像其他语言那样做它们。您最好创建与其他类完全不同的每个类,而不是普通继承。这是一种非官方的“C++方式”。
https://stackoverflow.com/questions/54470254
复制相似问题