更多C++学习题。我主要将 vector 与原始指针一起使用并取得了一定程度的成功,但是,我一直在尝试使用值对象来代替。我遇到的第一个问题是一般的编译错误。编译以下代码时出现错误:
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"));
}
问题 1:我假设这是因为以某种方式指定了 const 路径,和/或没有定义赋值运算符 - 为什么默认运算符不起作用?即使我假设这是因为我定义了一个 const 路径,这里是否在我的对象上定义了 const,const 甚至在这里为我赢得了什么吗?
Q2:其次,在这些值对象的 vector 中,我的对象是内存安全的吗? (意思是,它们会自动为我删除)。我读了here默认情况下, vector 会分配给堆——这是否意味着我需要“删除”任何内容。
Q3:第三,为了防止复制整个 vector ,我必须创建一个参数来传递 vector 作为引用,例如:
// static
FileReference::Query(const FileReference& reference, std::vector<FileReference>& files) {
// push stuff into the passed in vector
}
当函数死掉时,返回我不想死掉的大对象的标准是什么。我会从这里使用 shared_ptr 或类似的东西中受益吗?
最佳答案
如果任何成员变量是
const
,则无法创建默认赋值运算符;编译器不知道你想要发生什么。您将不得不编写自己的运算符重载,并弄清楚您想要什么行为。 (出于这个原因,const
成员变量通常没有人们最初想象的那么有用。)只要您不取得原始内存或其他资源的所有权,就没有什么需要清理的。
std::vector
在其生命周期结束时总是正确地删除其包含的元素,只要它们反过来总是正确地清理自己的资源。在你的例子中,你唯一的成员变量是一个std:string
,它也会照顾自己。所以你是完全安全的。您可以使用共享指针,但除非您进行概要分析并找出此处的瓶颈,否则我不会担心它。特别是,您应该阅读 copy elision ,编译器可以在很多情况下做到这一点。
关于c++ - 关于值类和 vector 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212379/