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



我正在用QT编写一个程序,它目前有一个GameEngine类和一个MainWindow类。

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
}

游戏引擎.cpp

#include "GameEngine.h"
// Omitting constructor and destructor for simplicity of the example
void GameEngine::test() {
emit newPlayerDataReady(&mPlayers);
}

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

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

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

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

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

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

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

要考虑的另一件事是对象生存期问题——即,如果你将一个const std::vector<Player>*传递给你的MainWindow类,并且MainWindow类保留了该指针值的副本(即将传入的指针复制到一个局部成员变量(,然后向量被破坏,MainWindow将保留一个悬空的指针,该指针将调用未定义的行为(即可能崩溃, 或者更糟糕的是,以某种非常难以调试的方式静默地损坏程序的内存空间(如果/当它试图取消引用指针时。 如果你想避免任何特定惨败的可能性,你可以通过智能指针传递数据(即shared_ptr,或者如果你更喜欢使用特定于Qt的API,QSharedPointer 或QPointer对象(。

相关内容

  • 没有找到相关文章