更多C++学习问题.我一直在使用矢量主要使用原始指针并取得了一定程度的成功,但是,我一直试图使用值对象来代替.我遇到的第一个问题是编译错误.编译下面的代码时出错:
class FileReference {
public:
FileReference(const char* path) : path(string(path)) {};
const std::string path;
};
int main(...) {
std::vector<FileReference> files;
// error C2582: 'operator =' function is unavailable in 'FileReference'
files.push_back(FileReference("d:\\blah\\blah\\blah"));
}
Run Code Online (Sandbox Code Playgroud)
Q1:我假设它是因为某种方式指定了一个const路径,和/或没有定义赋值运算符 - 为什么默认运算符不起作用?在我的对象上定义const甚至我假设它是因为我定义了一个const路径,const甚至在这里赢得了什么?
Q2:其次,在这些值对象的向量中,我的对象是否对内存安全?(意思是,它们会自动删除给我).我在这里读到默认情况下向量被分配到堆 - 所以这意味着我需要"删除"任何东西.
Q3:第三,为了防止复制整个矢量,我必须创建一个参数,将矢量作为参考传递,如:
// static
FileReference::Query(const FileReference& reference, std::vector<FileReference>& files) {
// push stuff into the passed in vector
}
Run Code Online (Sandbox Code Playgroud)
返回大型对象的标准是什么,当函数死亡时我不想死.我可以从这里使用shared_ptr或类似的东西中受益吗?
如果有任何成员变量const,则无法创建默认赋值运算符; 编译器不知道你想要发生什么.您必须编写自己的运算符重载,并找出您想要的行为.(出于这个原因,const成员变量通常没有人们想象的那么有用.)
只要您没有获得原始内存或其他资源的所有权,那么就没有什么可以清理的了.A std::vector总是在其生命周期结束时正确删除其包含的元素,只要它们反过来总是正确地清理它们自己的资源.在你的情况下,你唯一的成员变量是a std:string,它也照顾自己.所以你完全安全.
您可以使用共享指针,但除非您在此处进行性能分析并确定瓶颈,否则我不会担心它.特别是,您应该阅读有关复制省略的信息,编译器可以在许多情况下执行此操作.
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |