C ++: вектор Stati c, определенный в базовом классе, теряет свое значение в основном - PullRequest
0 голосов
/ 23 января 2020

Я определил вектор stati c (который будет использоваться в качестве аргумента по умолчанию для одной из функций-членов) в базовом классе (Base1). Когда я наследую этот класс вместе с классом Base2 в классе Derived, значение вектора stati c подходит для конструктора производного класса. Однако он теряется внутри функции 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);
};

base2. 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;
}

base1.hh

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

base1. cc

#include "base1.hh"

class Base1 *Base1::ptr_ = nullptr;

int main (int argc, char **argv) {
  class Temp obj;

  return obj.Run(argc, argv);
}

производный.hh

#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;
  };
};

производная. cc

#include "derived.hh"

REGISTER_PROC(Derived);

Консольный вывод при запуске exe:

$ ./daemon
Derived::Derived AllPorts.size = 32
Derived::Main AllPorts.size = 0
Base2::Reset AllPorts.size = 0

Есть идеи, что может пойти не так? Заранее спасибо.

Дополнительная информация: исполняемый файл 'daemon' создан из производного. cc и этот exe-файл связан с 2 библиотеками - одна создана из base1. cc, а другая из base2. cc , Обратите внимание, что main определен в base2. cc.

BUILD file

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"],
)

Также отметим, что если переменная stati c имеет встроенную в типе данных значение не теряется в main (). Пробовал с int и std :: string, значение не теряется, когда переменная stati c имеет тип int, а теряется с типом std :: string.

EDIT1: 1. Заменяется псевдокод на run и проверенный код. 2. Удален вывод gdb и добавлен вывод консоли после запуска exe. 3. Добавлен файл BUILD.

...