gpt4 book ai didi

c++ - 关于值类和 vector 的问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:07:16 25 4
gpt4 key购买 nike

更多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 或类似的东西中受益吗?

最佳答案

  1. 如果任何成员变量是const,则无法创建默认赋值运算符;编译器不知道你想要发生什么。您将不得不编写自己的运算符重载,并弄清楚您想要什么行为。 (出于这个原因,const 成员变量通常没有人们最初想象的那么有用。)

  2. 只要您不取得原始内存或其他资源的所有权,就没有什么需要清理的。 std::vector 在其生命周期结束时总是正确地删除其包含的元素,只要它们反过来总是正确地清理自己的资源。在你的例子中,你唯一的成员变量是一个 std:string,它也会照顾自己。所以你是完全安全的。

  3. 可以使用共享指针,但除非您进行概要分析并找出此处的瓶颈,否则我不会担心它。特别是,您应该阅读 copy elision ,编译器可以在很多情况下做到这一点。

关于c++ - 关于值类和 vector 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11212379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com