0

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

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

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

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

4

2 回答 2

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

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

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

于 2012-06-26T17:04:38.573 回答
3

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

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

拥有一个const成员会使该类不可分配。

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

于 2012-06-26T17:05:50.383 回答