首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能使外部类作为内部类c++内的成员对象

不能使外部类作为内部类c++内的成员对象
EN

Stack Overflow用户
提问于 2019-02-01 06:38:20
回答 1查看 33关注 0票数 0

关于下面的代码,我有3个问题:

代码语言:javascript
复制
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)的代码行,我会得到编译错误?

EN

回答 1

Stack Overflow用户

发布于 2019-02-01 06:56:50

如果我不太明白这一点,请原谅--我的C++有点生疏了。

关于问题(1) --您尝试过"this“关键字吗?

例如,:

代码语言:javascript
复制
void func() { this->y_ = 5; } 

下面是一个与您的几乎相同的示例:

'this' pointer in C++

对于问题2,您要求递归包含一个对象。这就像是在说,什么是洋葱?这是一个含有洋葱的皮。嗯,里面的洋葱也是一个包含洋葱的Peel,然后是Peel,然后是洋葱,等等。如果没有某种暂停的机制( Onion可能是Core,它什么都不包含),Onion对象的第一个实例化将无限循环,直到所有内存用完。

作为参考,内存只能在需要时检索,而不能在需要之前检索。

对于问题3,我采取了懒惰的方式,我说,这只是规则。

更新:我现在不在工作,所以我有更多的时间做一些更多的研究。正如我已经说过的,我的C++有点生疏了。

从本质上讲,对于Q1,您要做的是从类"iterator“访问类"cb”的成员。我的研究表明,仅仅因为"iterator“是"cb”的子类,它就不会获得任何特殊的访问权限。因此,您不能从“迭代器”访问"cb::y_“,也不能使用"this->y_”。类中的方法(函数)可以直接访问"y_“。子类不能。

注意以下成功编译的代码:

代码语言:javascript
复制
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++方式”。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54470254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档