Class C++;:基类中定义的静态向量将丢失它';s值

Class 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++) {

我在基类(Base1)中定义了一个静态向量(用作一个成员函数的默认参数)。当我在派生类中继承这个类和Base2类时,静态向量的值在派生类构造函数中很好。但是,它在main()函数中丢失

base2.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;
  };
};
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它打印从未初始化内存中解释的大小(可能为零)。