问题描述
我试图为自己创建一个单元测试框架,它运行良好,直到我把它变成一个静态库。静态容器 unit_base::_units 在构造之前使用。
我用以下更简单的版本重现了这个问题:
lib.lib
lib.h
#pragma once
#include <vector>
namespace est {
class unit_base
{
public:
unit_base();
class unit_vec : public std::vector<unit_base*> {
public:
unit_vec();
~unit_vec();
};
static unit_vec& get_units();
virtual bool run() const = 0;
private:
static unit_vec _units;
};
bool test_all();
}
lib.c
#include "lib.h"
#include <iostream>
namespace est {
unit_base::unit_vec unit_base::_units;
unit_base::unit_base() {
_units.push_back(this);
std::cout << "push unit to: " << &_units << std::endl;
}
unit_base::unit_vec::unit_vec() {
std::cout << "vec(): " << this << std::endl;
}
unit_base::unit_vec::~unit_vec() {
std::cout << "~vec(): " << this << std::endl;
}
unit_base::unit_vec& unit_base::get_units()
{
return _units;
}
bool test_all()
{
std::cout << "before get_units" << std::endl;
auto& units = unit_base::get_units();
std::cout << "after get units" << std::endl;
for(auto& u: units) {
u->run();
}
return false;
}
}
exe
test.cpp
#include "lib.h"
#include <iostream>
namespace est
{
bool est_test_func();
class est_test : public unit_base
{
public:
est_test():
unit_base() {}
bool run() const override
{
return est_test_func();
}
};
static est_test est_test_inst;
bool est_test_func() {
std::cout << "test" << std::endl;
return true;
}
}
int main(int argc,char** argv)
{
est::test_all();
}
exe 打印:
推送单元到:0x7f72dc873170
vec(): 0x7f72dc873170
在 get_units
之前
获得单位后
~vec(): 0x7f72dc873170
我在 Windows 和 WSL 上对其进行了测试,结果都是 test_all() 的 _units 为空。 我一定是做错了什么,所以我在这里寻求帮助。
我使用 CMakeLists 创建了一个存储库:https://github.com/Lucipetus/problemic.git
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)