Pull to refresh
0
0
Ярослав Кокорев @mr_Ulman

Инженер-программист

Send message

Спасибо! Разобрался!

А про inline можете объяснить, если не сложно? Не очень понятно как оно должно быть, но без него у меня ни в OnlineGDB ни на компьютере не работает.

Есть вопрос по этому месту.

template <class Stub, typename Stub::type x>
 struct private_member {   private_member() { member<Stub>::value = x; 
} // сохранение адреса переменной }; 

У вас в OnlineGDB здесь есть еще static private_member instance

в котором не хватает inline, т.к. не создается экземпляр private_member, мы не попадаем в конструктор и по факту

papa.*member<A_x>::value = "deneg net";

std::cout << papa.*member<A_x>::value << std::endl;

кладёт данные куда то мимо поля private. Это видно в отладке, или если попытаться сделать вывод до и после например с помощью публичного метода.

Вот вывод прям по вашему примеру без inline:

template <class Stub, typename Stub::type x>
 struct private_member { 
   private_member() { member<Stub>::value = x; 
  static private_member instance;
} // сохранение адреса переменной }; 

// Остальной код пропущен для краткости
   
int main() {
    PapaPavlica papa;
    std::cout << papa.*member<A_x>::value << std::endl;
    papa.*member<A_x>::value = "deneg net";
    std::cout << papa.*member<A_x>::value << std::endl;
}

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

А вот с inline:

template <class Stub, typename Stub::type x>
 struct private_member { 
   private_member() { member<Stub>::value = x; 
   inline static private_member instance;
} ;// сохранение адреса переменной

// Остальной код пропущен для краткости
   
int main() {
    PapaPavlica papa;
    std::cout << papa.*member<A_x>::value << std::endl;
    papa.*member<A_x>::value = "deneg net";
    std::cout << papa.*member<A_x>::value << std::endl;
}

papini dengi
deneg net

Process finished with exit code 0

Information

Rating
Does not participate
Location
Раменское, Москва и Московская обл., Россия
Registered
Activity

Specialization

Backend Developer, Embedded Software Engineer
Middle
Git
C++
C
Programming microcontrollers
System Programming
Qt
Linux
JavaScript
QML
Node.js