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

标签 c++

更多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/

相关文章:

c++ - 在不使用循环的情况下查找给定数字属于哪一组数字(范围)

c++ - ADL 在 constexpr 函数中不起作用(仅限 clang)

c++ - Simpson 的 Thrust 集成代码在两台使用 NVC++ 的机器上输出不同的结果

c++ - 通过循环 C++ 打印报价单

c++ - 堆栈分配如何工作?

c++ - 在应该按引用传递的地方按值传递指针

java - 360度合成景观

c++ - 使用运算符 = 将 vector (从 vector 的 vector 中提取)分配给另一个 vector 时出错

c++ - TCA9548a(I2C 多路复用器)C++ 集成

c++ - 如何抑制隐式复制构造函数/赋值运算符中的成员?