我正在用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对象(。