Я определил вектор 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.