我碰到的一个问题,我不明白,我希望这里有人可能会提供一些见解。简化的代码如下所示(原码是一个定制队列/队列迭代器实现):

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”的对象,但这样只会隐藏的问题(我还是不明白,为什么我不能做到这一点)。

我想原因是引用不能被复制,但我不明白为什么。我是否需要提供我自己的赋值操作符和拷贝构造函数?

有帮助吗?

解决方案

此问题无关与内部类。在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;
}

其他提示

一个参考不能被给予其初始值之后被改变。这意味着,这是不可能写赋值运算符,其改变基准部件的值。如果你需要做到这一点,使用指针,而不是一个参考的。

实际上,有这种溶液。您可以实现operator =在副本方面建设,它会工作:)它是这样的情况一个非常有能力的技术。假设你想支持的任务。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top