C++/QT:使用指向私有成员的常量指针作为只读数据共享

C++/QT: Using constant pointer to private member as read-only data-sharing

我正在用QT写一个程序,目前有一个GameEngineclass和一个MainWindowclass.

GameEngine.h:

#include "Player.h"

class GameEngine : public QObject
{
    Q_OBJECT

public:
    void test();

signals:
    void newPlayerDataReady(const std::vector<Player>* playerList);

private:
    std::vector<Player> mPlayers; // List of player objects
}

GameEngine.cpp

#include "GameEngine.h"

// Omitting constructor and destructor for simplicity of the example

void GameEngine::test() {
    emit newPlayerDataReady(&mPlayers);
}

GameEngine 在 Player 实例数组中存储了大量数据(Player 是一个相当复杂的 class 本身,有很多不同的成员),必须存储在那里集中程序的逻辑(长话短说)。

MainWindow 是一个 GUI class,它应该可视化数据,当信号 newPlayerDataReady 发出并在图表上表示大量数据时,一个列表等。这是通过将信号连接到 MainWindow class 中的专用插槽来完成的。连接在 Main.cpp 中创建,它拥有两个 classes.

的实例

所以,我的问题是: 如果我想在不让接收方更改数据(只读访问)的情况下将所有这些数据从一个 class 共享到另一个,是否有更好的通用做法来执行此操作,而不是使用常量指向数据的指针?

并不是我不喜欢这个解决方案。我只是想绝对确定我从一开始就做对了,而不是在这个过程的后期进行大量返工。

我知道可以通过一种替代方法将数据交换为私有成员的副本,但我认为这不是一个顺利的解决方案,因为数据量会增加到一定程度,可能影响程序运行速度。

So, my question is: If I want to share all this data from one class to another without letting the receiver alter the data (read-only access), is there a better common practice to do this, rather than using constant pointers to the data?

通过 const-pointers 共享很好,尽管共享 const-reference(即 const std::vector<Player> &)可能更可取,因为任何接收 const-reference 的代码都可以 100% 确保任何它收到的引用不是 NULL,因为语言不允许 NULL 引用(而 NULL 指针是允许的)。

要考虑的另一件事是对象生命周期问题——即如果您将 const std::vector<Player>* 传递给 MainWindow class,并且 MainWindow class 保留该指针值的副本(即将传入的指针复制到局部成员变量),然后向量被破坏, MainWindow 将保留一个悬空指针,该悬空指针将调用 undefined行为(即可能崩溃,或者更糟,以某种非常难以调试的方式无声地破坏程序的内存 space)if/when 它曾经尝试取消引用指针。如果你想避免那个特定惨败的任何可能性,你可以通过智能指针传递数据(即 shared_ptr, or if you prefer to use the Qt-specific APIs, a QSharedPointer or QPointer 对象)