Class C++;:基类中定义的静态向量将丢失它';s值
我在基类(Base1)中定义了一个静态向量(用作一个成员函数的默认参数)。当我在派生类中继承这个类和Base2类时,静态向量的值在派生类构造函数中很好。但是,它在main()函数中丢失 base2.hhClass C++;:基类中定义的静态向量将丢失它';s值,class,c++11,inheritance,vector,static,Class,C++11,Inheritance,Vector,Static,我在基类(Base1)中定义了一个静态向量(用作一个成员函数的默认参数)。当我在派生类中继承这个类和Base2类时,静态向量的值在派生类构造函数中很好。但是,它在main()函数中丢失 base2.hh #include<iostream> #include<vector> using namespace std; class Base2 { public: Base2() { for (int i = 0; i < 32; i++) {
#include<iostream>
#include<vector>
using namespace std;
class Base2 {
public:
Base2() {
for (int i = 0; i < 32; i++) {
AllPorts.push_back(i);
}
};
static vector<uint32_t> AllPorts;
void Reset(vector<uint32_t> ports = AllPorts);
};
class Base1 {
public:
friend class Temp;
Base1() {
ptr_ = this;
};
virtual int Main(int argc, char **argv) = 0;
private:
static class Base1 *ptr_;
};
class Temp {
public:
int Run (int argc, char **argv) {
return Base1::ptr_->Main(argc, argv);
};
Temp() {};
};
#define REGISTER_PROC(name) name __##name
#include "base1.hh"
#include "base2.hh"
class Derived final : public Base1, public Base2 {
public:
Derived() : Base1(), Base2() {
cout << "Derived::Derived AllPorts.size = " << Base2::AllPorts.size() << endl;
};
int Main (int argc, char** argv) {
cout << "Derived::Main AllPorts.size = " << Base2::AllPorts.size() << endl;
Reset();
return 0;
};
};
base1.cc
#include "base2.hh"
vector<uint32_t> Base2::AllPorts;
void Base2::Reset(vector<uint32_t> ports) {
cout << "Base2::Reset AllPorts.size = " << Base2::AllPorts.size() << endl;
}
#include "base1.hh"
class Base1 *Base1::ptr_ = nullptr;
int main (int argc, char **argv) {
class Temp obj;
return obj.Run(argc, argv);
}
#include "derived.hh"
REGISTER_PROC(Derived);
派生.hh
#include<iostream>
#include<vector>
using namespace std;
class Base2 {
public:
Base2() {
for (int i = 0; i < 32; i++) {
AllPorts.push_back(i);
}
};
static vector<uint32_t> AllPorts;
void Reset(vector<uint32_t> ports = AllPorts);
};
class Base1 {
public:
friend class Temp;
Base1() {
ptr_ = this;
};
virtual int Main(int argc, char **argv) = 0;
private:
static class Base1 *ptr_;
};
class Temp {
public:
int Run (int argc, char **argv) {
return Base1::ptr_->Main(argc, argv);
};
Temp() {};
};
#define REGISTER_PROC(name) name __##name
#include "base1.hh"
#include "base2.hh"
class Derived final : public Base1, public Base2 {
public:
Derived() : Base1(), Base2() {
cout << "Derived::Derived AllPorts.size = " << Base2::AllPorts.size() << endl;
};
int Main (int argc, char** argv) {
cout << "Derived::Main AllPorts.size = " << Base2::AllPorts.size() << endl;
Reset();
return 0;
};
};
运行exe时的控制台输出:
$ ./daemon
Derived::Derived AllPorts.size = 32
Derived::Main AllPorts.size = 0
Base2::Reset AllPorts.size = 0
对可能出现的问题有什么想法吗?提前谢谢
其他信息:
“daemon”可执行文件是从derived.cc创建的,此可执行文件链接到两个库-一个是从base1.cc创建的,另一个是从base2.cc创建的。注意,main是在base2.cc中定义的
生成文件
cc_library (
name = "base1",
srcs = ["base1.cc"],
hdrs = ["base1.hh"],
visibility = ["//visibility:public"],
)
cc_library (
name = "base2",
srcs = ["base2.cc"],
hdrs = ["base2.hh"],
visibility = ["//visibility:public"],
)
cc_binary(
name = "daemon",
srcs = ["derived.cc", "derived.hh",],
deps = ["base1", "base2",],
visibility = ["//visibility:public"],
)
另外,请注意,如果静态变量为内置数据类型,则该值不会在main()中丢失。尝试使用int和std::string,当静态变量为int类型时,值不会丢失,而使用std::string类型时,值会丢失
编辑1:
1.将伪代码替换为正在运行并经过验证的代码。
2.删除了gdb输出,并在运行exe后添加了控制台输出。
3.添加了构建文件。您的gdb会话引用了
Base1::allport
,但您的代码显示了Base2::allport
。此外,调试会话还表明存在所示代码中缺少的输出语句。最好准备一个。如果obj
是一个单独源文件中的全局变量,而不是allport
的定义,那么这可能是静态初始化顺序失败的一种情况(即allport
在obj
之后构造(幸运的是UB没有崩溃)@IgorTandetnik:添加了验证代码并重现了问题(从控制台日志中可以看出)。@Frank:这是一个有效的观点,但这里的情况似乎不是这样。如果您看到控制台输出,则构造函数派生::派生(在声明派生类的对象时将调用该构造函数)正确打印所有端口的大小。@Piyush它打印从未初始化内存中解释的大小(可能为零)。