7

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

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

4 回答 4

13

这个问题与内部类无关。在 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;
}
于 2009-12-02T13:04:24.843 回答
6

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

于 2009-12-02T13:01:32.867 回答
3

实际上,有一个解决方案。您可以在复制构造方面实现 operator=,它会起作用:) 对于这种情况,这是一种非常有能力的技术。假设您确实想支持分配。

于 2009-12-02T20:54:33.030 回答
0

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

于 2009-12-02T18:36:15.670 回答