【问题标题】:Questions concerning value classes and vectors关于值类和向量的问题
【发布时间】:2012-06-28 01:39:01
【问题描述】:

更多 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"));

}

Q1:我假设这是因为以某种方式指定了 const 路径和/或未定义赋值运算符 - 为什么默认运算符不起作用?即使我假设这是因为我定义了一个 const 路径,是否在我的对象上定义 const , const 甚至在这里为我赢得了什么?

Q2:其次,在这些值对象的向量中,我的对象是内存安全的吗? (意思是,它们会被我自动删除)。我读到here,默认情况下向量被分配给堆——这是否意味着我需要“删除”任何东西。

Q3:第三,为了防止复制整个向量,我必须创建一个将向量作为参考传递的参数,例如:

// static
FileReference::Query(const FileReference& reference, std::vector<FileReference>& files) {
    // push stuff into the passed in vector
}

当函数死亡时返回我不想死亡的大对象的标准是什么。我会从在这里使用 shared_ptr 或类似的东西中受益吗?

【问题讨论】:

  • class FileReference 而不是class File?此外,类声明末尾缺少;
  • 谢谢,只是一个快速的存根

标签: c++


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

  2. 只要您不拥有原始内存或其他资源的所有权,就无需清理任何东西。 std::vector 在其生命周期结束时总是正确地删除其包含的元素,只要它们反过来总是正确地清理自己的资源。在您的情况下,您唯一的成员变量是std:string,它也会照顾自己。所以你是完全安全的。

  3. 可以使用共享指针,但除非您在此处进行分析并确定瓶颈,否则我不会担心。特别是,您应该阅读有关 copy elision 的信息,编译器可以在许多情况下执行此操作。

【讨论】:

  • 感谢您的链接。真是帮倒忙。编译器太神奇了。
【解决方案2】:

vector 中的元素必须可以从 C++ 标准的第 23.2.4 节类模板向量中赋值:

...存储的对象应满足Assignable的要求。

拥有const 成员会使该类无法分配。

由于元素是按值存储的,当向量被销毁或从向量中删除时,它们将被销毁。如果元素是原始指针,那么它们必须是明确的deleted。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2021-10-27
    • 2011-07-20
    • 1970-01-01
    • 2017-03-14
    • 2015-01-12
    相关资源
    最近更新 更多