0

如果这可能是一个非常简单的问题,我很抱歉,但我是 c++ 的新手,并且正在研究一个简单的可口训练器来理解 c++。(来自java ..)

我想传递一个const FileManager作为我的逻辑的参考。但我不明白它的工作。我不想有副本之类的。

所以我这样尝试:(主要)

FileManager& file = FileManager();
Logic logic = Logic(file);

在逻辑内部,我想存储参考:

class Logic
{
public:

    Logic(const FileManager& manager);
    ~Logic();

private: 
    const FileManager& m_fileManager;
};

Logic::Logic(const FileManager& manager) : 
{   
    m_fileManager = manager;
}

谢谢

4

2 回答 2

7

一旦进入构造函数的主体,所有成员变量都已经被初始化。此后,您只能分配给他们。这不适用于引用 - 正如我们所知,它们需要在其生命周期开始时进行初始化。

您需要使用成员初始化列表:

Logic::Logic(const FileManager& manager)
    : m_fileManager(manager) // m_fileManager is initialized here
{   
}

考虑一下你是否真的想要一个参考成员。一方面,它们使您的课程不可分配。智能指针可能是更好的选择。

于 2013-11-02T12:30:00.887 回答
0

你的例子有三个缺陷。首先,您尝试使用临时对象初始化非 const 引用:

FileManager& file = FileManager();

您很可能只想在这里使用 FileManager 实例:

FileManager file;

其次,必须初始化引用。您可以通过使用初始化列表语法来实现这一点:

Logic::Logic(const FileManager& manager) 
  : m_fileManager( manager )
{   
}

此外,用于 Logic 的初始化要求 Logic 是可分配的。只需使用:

Logic logic(file);

如果您在类中有引用成员,则默认情况下该类的对象不可分配。

于 2013-11-02T12:52:02.527 回答