我很抱歉,如果这个问题是一个非常简单的问题,但我是c ++的新手,并且正在研究一个简单的vocable培训师来理解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;
}
由于
答案 0 :(得分:7)
输入构造函数的主体后,所有成员变量都已初始化。此后,您只能分配给他们。这不适用于引用 - 正如我们所知,它们需要在它们的生命周期开始时进行初始化。
您需要使用成员初始化列表:
Logic::Logic(const FileManager& manager)
: m_fileManager(manager) // m_fileManager is initialized here
{
}
考虑一下你是否真的想要一个参考成员。首先,它们使您的课程不可分配。智能指针可能是更好的选择。
答案 1 :(得分:0)
你的例子有三个缺陷。第一个是,您尝试使用临时对象初始化无const引用:
FileManager& file = FileManager();
很可能你只想在这里使用FileManager实例:
FileManager file;
其次,必须初始化引用。您可以使用初始化列表语法来实现此目的:
Logic::Logic(const FileManager& manager)
: m_fileManager( manager )
{
}
此外,用于Logic的初始化要求Logic可分配。只需使用:
Logic logic(file);
如果类中有引用成员,则默认情况下不能分配该类的对象。