有关价值类和向量的问题

时间:2012-06-26 17:02:18

标签: c++

更多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默认情况下向量被分配到堆 - 所以这意味着我需要“删除”任何东西。

问题3:第三,为了防止复制整个矢量,我必须创建一个参数,将矢量作为参考传递,如:

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:3)

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

  

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

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

当元素按值存储时,它们将在向量被破坏或从向量中移除时被破坏。如果元素是原始指针,那么它们必须明确delete d。