代码之家  ›  专栏  ›  技术社区  ›  laura

具有引用成员的内部类中的默认赋值运算符

  •  7
  • laura  · 技术社区  · 16 年前

    我遇到了一个我不理解的问题,我希望这里的人能提供一些见解。简化代码如下(原始代码是自定义队列/队列迭代器实现):

    class B
    {
    public:
        B() {};
        class C
        {
        public:
            int get();
            C(B&b) : b(b){};
        private:
            B& b;
        };
    public:
        C get_c() { return C(*this); }
    };
    
    int main()
    {
        B b;
        B::C c = b.get_c();
    
    
        c = b.get_c();
        return EXIT_SUCCESS;
    }
    

    在编译时,会出现以下错误:

    foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)':
    foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator
    foo.cpp: In function 'int main()':
    foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here
    

    我可以通过使用两个独立的C变量来解决这个问题,因为它们应该是独立的“C”对象,但这只隐藏了问题(我仍然不明白为什么我不能这样做)。

    我认为原因是参考资料不能被复制,但我不明白为什么。我需要提供自己的赋值操作符和复制构造函数吗?

    4 回复  |  直到 11 年前
        1
  •  13
  •   mkm    11 年前

    这个问题与内部类无关。在C++中,你不能(重新)分配引用——它们需要在定义时被初始化。

    一个简单的例子是:

    class B
    {
    public:
        B(int& i) : ir(i) {};
    
        int& ir;
    };
    
    
    int main()
    {
        int i;
        B b(i);      // Constructor - OK
    
        int j;
        B bb = B(j); // Copy constructor - OK
    
        bb = b;      // Assignment - Error
        return 0;
    }
    
        2
  •  6
  •   interjay    16 年前

    给定引用的初始值后,不能更改该引用。这意味着不可能写一个改变引用成员值的赋值运算符。如果需要这样做,请使用指针而不是引用。

        3
  •  3
  •   rmn    16 年前

    事实上,有一个解决办法。你可以 implement operator= in terms of copy construction 这是一种非常有效的技术。假设您确实想支持分配。

        4
  •  0
  •   DrPizza    16 年前

    C++没有“内部类”,只是嵌套类声明。“内部类”是一个Java的ISM,我认为它不存在于其他主流语言中。在爪哇中,内部类是特殊的,因为它们包含对包含类型的对象的隐式不可变引用。为了实现与Java中的C++嵌套声明等价,需要使用静态内部类;静态内部类不包含对声明类型对象的引用。