【问题标题】:Why does my static std::vector erases when used from a class?为什么我的静态 std::vector 从类中使用时会擦除?
【发布时间】:2021-08-11 16:07:44
【问题描述】:

我在一个标题中有一个static std::vector 来保存某些行为的报告,但由于某种原因,当我想查阅它时,vector 会被删除。注意:要使此错误起作用,必须将其分成 4 个文件:

Reports.hpp

#ifndef REPORTS_HPP_INCLUDED
#define REPORTS_HPP_INCLUDED
#include <vector>

static std::vector<int> reports;

#endif // REPORTS_HPP_INCLUDED

所以reports是要修改的std::vector

Modifier.h

#ifndef MODIFIER_H
#define MODIFIER_H

class Modifier
{
public:
    Modifier() = default;
    void report();
};

#endif // MODIFIER_H

Modifier.cpp

#include "Modifier.h"
#include "Reports.hpp"
#include <iostream>

void Modifier::report(){
    //std::cout << "Now reports is at: " << reports.size() << std::endl;
    //uncomment the code above if you want to see that reports IS modified.
    reports.push_back(0);
}

最后,当代码对我来说毫无意义时:

main.cpp

#include <iostream>
#include "Modifier.h"
#include "Reports.hpp"

int main()
{
    Modifier m;
    for (size_t i = 0; i < 100; ++i)
        m.report();
    std::cout << reports.size() << std::endl;
}

(这将打印0,不应该是100吗?)

请注意,如果我通过将成员 report() 放在标题 Modifier.h 中来内联它,它可以正常工作,但不是这样。我也尝试了 3 种不同的编译器,但没有任何变化。

为什么vector reports 在这一切之后是空的?你会怎么解决呢?

【问题讨论】:

    标签: c++ class vector


    【解决方案1】:

    因为这就是在全局范围内声明的 static 对象的工作方式。每个包含它的 .cpp 都有自己的私有对象,其他 .cpp 文件无法访问该对象。

    如果要声明一个可从所有.cpp 文件访问的对象,则必须在头文件中将其声明为extern,而不是static,然后定义它(不带extern 关键字) 在正好一个 .cpp 文件中。

    【讨论】:

    • 正确。如果我希望所有线程都可以访问变量,thread_local 怎么办?
    • 那就别这样thread_localthread_local 的全部目的是每个线程都有自己的对象。
    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2021-10-07
    相关资源
    最近更新 更多