【问题标题】:can not make outer class as member object inside inner class c++不能将外部类作为内部类c ++中的成员对象
【发布时间】:2019-01-31 22:38:19
【问题描述】:

我对以下代码有 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- 为什么我不能像(1)那样在内部类中使用外部类的成员变量y_

2- 为什么我不能像 in(2) 那样从内部类中的外部类创建对象,但我只能创建指针和引用?

3- 如果我将 (3) cb c; 处的行移动到 (4) 处的行,为什么会出现编译错误?

【问题讨论】:

    标签: inner-classes this-pointer


    【解决方案1】:

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

    关于问题(1)——你试过“this”关键字吗?

    例如:

    void func() { this->y_ = 5; } 
    

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

    'this' pointer in C++

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

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

    对于问题 3,我偷懒地说,它们只是规则。

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

    基本上对于 Q 1,您尝试做的是从“迭代器”类访问“cb”类的成员。我的研究表明,仅仅因为“iterator”是“cb”的子类,它并没有获得任何特殊的访问权限。所以你不能从“iterator”访问“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”的“朋友”类。或者也许更好,更简单,只是在类中包含一组迭代器方法。这些方法将拥有对所有类属性的完全访问权限。

    还要注意对“cb”的指针引用。它不会编译为子类中的直接对象实例化。再次,洋葱问题。

    附带说明,请记住 C++ 不是 Pascal。这不是Java。它可以做子类,但正如你所见,它做的不是很好,或者至少,它不像其他语言那样做。除了正常的继承之外,您最好创建与其他所有类完全不同的每个类。这是一种非正式的“C++ 方式”。

    【讨论】:

    • 是的,我尝试this->y_ = 5 时出现同样的错误。我使用 vs2017 c++17。
    猜你喜欢
    • 1970-01-01
    • 2017-11-13
    • 2016-04-08
    • 1970-01-01
    • 2020-08-02
    • 2012-10-29
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多