传递对构造函数的引用

Pass a reference to a constructor

本文关键字:引用 构造函数      更新时间:2023-10-16

如果这是一个非常简单的问题,我很抱歉,但我是 c++ 的新手,并且正在研究一个简单的可发音训练器来理解 C++。(来自爪哇。

我想传递一个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;
}

谢谢

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

您需要使用成员初始值设定项列表:

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

考虑是否真的需要引用成员。首先,它们使您的类不可分配。智能指针可能是更好的选择。

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

FileManager& file = FileManager();

很可能您只想在此处使用文件管理器实例:

FileManager file;

其次,必须初始化引用。您可以使用初始值设定项列表语法来实现此目的:

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

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

Logic logic(file);

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