我有一个 C++ 静态类,它有一个创建对象的方法。我想在另一个函数中检索此方法创建的对象,以便此新函数获得该对象的所有权。这是我到目前为止的代码:
MessageBoxes.h
class MessageBoxes {
public:
static int info(const QString& message, const QString& title = _("Information"), QMessageBox::StandardButtons buttons = QMessageBox::Ok);
static int confirmation(const QString& message, const QString& title = _("Confirmation"), QMessageBox::StandardButtons buttons = QMessageBox::Ok | QMessageBox::Cancel);
static int error(const QString& message, const QString& title = _("Error"), QMessageBox::StandardButtons buttons = QMessageBox::Ok);
private:
static QMessageBox& createMessageBox(const QString& message, const QString& title = "", QMessageBox::StandardButtons buttons = QMessageBox::Ok);
};
MessageBoxes.cpp
QMessageBox& MessageBoxes::createMessageBox(const QString& message, const QString& title, QMessageBox::StandardButtons buttons) {
QMessageBox msgBox;
msgBox.setWindowTitle(title);
msgBox.setText(message);
msgBox.setStandardButtons(buttons);
return msgBox;
}
int MessageBoxes::confirmation(const QString& message, const QString& title, QMessageBox::StandardButtons buttons) {
QMessageBox m = createMessageBox(message, title, buttons);
return m.exec();
}
问题是在 QMessageBox m = createMessageBox(message, title, buttons)
行,编译器告诉我 QMessageBox 的复制构造函数被禁用。这很好,但是我不想复制,我想获取在 createMessageBox
中创建的实际对象。我将 createMessageBox
的返回类型声明为 QMessageBox& 并假设它会返回引用,但它似乎不是那样工作的。知道我该怎么做吗?
最佳答案
0) 我们在 C++ 中不做这种“静态类”的事情。这些是处理 Java 和 C# 强制您将所有代码放入类这一事实的 hack。 C++ 不这样做,所以我们不应该绕过不存在的限制。类不是代码的存储位置;它们的存在是为了定义数据类型。您真正想要做的是通过将代码分组在一个通用名称下来组织代码;我们使用 namespace
来做到这一点。
1) 您不得返回对局部变量的引用。引用用于返回已经存在的东西。
2) 您不想返回一个引用,因为createMessageBox
的目的是创建一个消息框。您返回一个值:创建的消息框。
3) 当你写的时候
Foo bar = something();
something()
的结果被复制,即使 something()
确实碰巧返回了一个对已经存在的事物的引用。这是因为 bar
的类型是 Foo
,而不是 Foo&
。 bar
必须拥有自己的 Foo
;它不能引用一个,因为它不是引用。由于 something()
返回的 Foo
本身就是一个值,在内存中有自己的位置,我们不能只是让它“成为” 栏
;程序必须复制一份。
要引用函数的结果,您可以编写 Foo& bar = something();
。这将延长返回对象的生命周期(通常会立即超出范围),因此引用临时对象没有问题。
4) 然而,优化编译器很聪明,这不太可能给您带来任何好处。如果您只是返回一个值并按值分配,那么复制实际上不会发生的可能性很大(尽管标准实际上说您的代码必须为这种可能性做好准备)。
5) 老实说,动态分配在这里是一个非常糟糕的主意。如果你必须这样做,至少使用某种智能指针包装器。虽然,当您的复制构造函数被禁用时,有时您会遇到这种情况。 :/
关于c++ - 如何在 C++ 中返回对变量的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7035735/