c++ - 如何在 C++ 中返回对变量的引用?

标签 c++ reference

我有一个 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/

相关文章:

c++ - 为什么这段代码不会产生编译错误?

c++ - 如何从成员 QThread 更改 QMainWindow 上的 Qt GUI 小部件?

c# - 将 C#dll 加载到 C# exe 中

c# - 在字典中存储对对象的引用

java - 每次调试时对象的引用都会发生变化

c++ - 在 Makefile.am 的 _SOURCE 中分配 c 和 cpp 文件

c++ - 我可以使用 Visual Studio 以外的 IDE 来开发 Windows GPIO 驱动程序吗?

c++ - 使用 C++ 的 GPIO 引脚 RaspberryPi

c++ - System::对 C++ char* 参数的字符串引用

C# 4.0 允许项目不关心引用版本