在 [closed] 周围传递静态成员向量变量

Passing static member vector variable around [closed]

提问人:user1538798 提问时间:11/15/2023 更新时间:11/15/2023 访问量:62

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

8天前关闭。

我有以下代码

// ClassA.h
class A{
   public:
       A();
       virtual ~A();
       static std::vector<A*> A_list;
   // other functions
};

// ClassA.cpp
A::A()
{
    A::A_list.push_back(this);
}

这是A类的定义。A_list旨在包含在程序中创建的所有 A 对象

// ClassB.h

class B{
   public:
       B();
       virtual ~B();
       create();


   // other functions
};

// ClassB.cpp
#include "ClassA.h"
#include "ClassB.h"
B::B()
B::~B()

void B::create()
{
   for(auto var: A_list)
      printf("msg \n");
}

这是 B 类的简化定义,它使用 A_list(包含创建的所有 A 对象)来执行某些功能(此处未显示,但当前正在打印所有 A 对象)

// main.cpp
namespace d{
    A a1;
    A a2;
    A a3;
};

// main.cpp
int main()
{
    B b1;
    b1.create();
    
    return 0;
}

我希望控制台终端打印这样的东西

msg
msg
msg

但相反,控制台什么也没打印出来

我正在使用 gcc 11.xx 在 vscode、ubuntu 20.04 中编码。我已经通过在调试器中放置一个断点来完成调试器

A::A_list.push_back(this);

A_list似乎在增加长度,表明物体被推到了它上面。然而,当涉及到

B::创建()

发现A_list为空。

我认为问题出在初始化上,但我不确定如何纠正它们

需要帮助或指针

谢谢

C++ 静态

评论

5赞 Some programmer dude 11/15/2023
请记住,一个完美的最小可重现示例应该是我们可以复制粘贴并尝试构建和运行自己来复制您遇到的问题。您拥有的代码不会生成。对于这样一个简单易用的示例,您可以将其全部放入单个源文件中。
3赞 Some programmer dude 11/15/2023
请注意,如果在将其全部放入单个源文件中时,一切都按预期工作,那么您可能遇到了静态初始化顺序惨败的问题。
2赞 user12002570 11/15/2023
这甚至不会编译。等的包含在哪里?程序中存在多个错误。提供最小的可重现示例vector
1赞 Alex 11/15/2023
尝试添加到 main.cpp 的顶部,在定义所有 B 的命名空间之前。std::vector<A*> A::A_list;
1赞 Aconcagua 11/15/2023
您似乎没有提供定义(参见@Alex,尽管通常会进入 - 再次存在静态初始化惨败的风险,请参阅 SPD)。但实际上,您之前应该已经遇到过链接器错误。顺便说一句,如果声明向量,则无需定义。A::A_listclassA.cppstatic inline

答: 暂无答案