假设我有一个MainWindow
课程作为我的课程gui的一部分。使用FileChooser
对话框,我想将图像文件加载到我的程序中。目前我获取了所选文件的文件名,构造了一个Image
对象,该对象隐藏了加载逻辑,并希望将其存储为MainWindow
类的一部分。我的问题是,你将如何存储对象。我知道同时只有一个加载的图像,因此使用像std::vector
这样的容器格式对我来说似乎不是很有用。
我的意思是:
- 使用非指针成员。但这很难,因为我无法在Image
类的构造时构造MainWindow
对象。
- 使用unique_ptr
,因为当MainWindow
获得所有权时我会说它没关系,但我不确定当我必须将指针传递给对象时这是否非常有用可以显示数据集的某些特定争用的小部件)。
- 在这种情况下使用shared_ptr
允许子窗口小部件存储自己指向Image
对象的指针
我知道这是一个“noobish”的问题,但我目前没有好主意。
答案 0 :(得分:1)
存储文件的规范方法是std::vector<uint8_t>
。
如果您的程序在单个数据集上运行的时间足够了。
在构建你的MainWindow
类之后,向量只会是空的,直到你决定加载一个文件(我认为这是你想表达的意思一个普通成员对我来说似乎很难)。
如果可以将多个数据集加载到您的程序中,则可以使用std::vector<std::vector<uint8_t>>
。
由于std::vector
已经为您提供了所需的大部分功能(比如存储缓冲区的大小,简单的大小调整等),我不建议您使用其中一个智能指针来处理您正在做的事情。
更新后修改
由于你已经有一个隐藏缓冲区的Image
类,std::vector<uint8_t>
当然没有任何意义。在这种情况下,真正的智能指针之一将是您的最佳选择。您选择哪一个取决于以下内容:
如果您的功能采用std::shared_ptr<Image>
,那么将Image
存储为std::shared_ptr<Image>
是有意义的。
如果您的功能采用Image*
或Image const*
,您仍然可以使用std::shared<Image>
,但std::unique_ptr<Image>
也可以使用,因为您可以获得指向通过调用std::unique_ptr::get()
来反对。
因此,使用std::unique_ptr
并不会阻止您传递Image
。您只需确保在仍有对象的引用时不释放该对象。这应该不是问题,因为您将其存储在主应用程序类中。