Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, kov_serg, Вы писали:
_>>Как такое написать по Сиплюсплюсному что бы без UB
BFE> | | Скрытый текст |
| | _>>_>>#include <stdio.h>
_>>template<class A,class B>A*parent_of(B*self,B A::*t) {
_>> return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
_>>}
_>>template<class A,class B>A*parent_of(B*self,B(A::*t)[1]) {
_>> return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
_>>}
_>>struct I1 { virtual void show()=0; };
_>>struct I2 { virtual void print()=0; };
_>>struct A {
_>> int x[3];
_>> struct :I1 {
_>> A* parent() { return parent_of(this,&A::i1); }
_>> void show() { printf("show x0=%d\n",parent()->x[0]); }
_>> } i1[1];
_>> struct :I2 {
_>> A* parent() { return parent_of(this,&A::i2); }
_>> void print() { printf("print x0=%d\n",parent()->x[0]); }
_>> } i2[1];
_>>};
_>>void fn(I1* i) { i->show(); }
_>>void fn(I2* i) { i->print(); }
_>>int main(int argc, char **argv) {
_>> A a[1];
a->>>x[0]=123;
_>> fn(a->i1);
_>> fn(a->i2);
_>> return 0;
_>>}
_>>
|
| | |
BFE>BFE>#include <stdio.h>
BFE>struct I1
BFE>{
BFE> virtual void show()=0;
BFE>};
BFE>struct I2
BFE>{
BFE> virtual void print()=0;
BFE>};
BFE>struct A : I1,I2
BFE>{
BFE> int x[3];
BFE> void show() { printf("show x0=%d\n",x[0]); }
BFE> void print() { printf("print x0=%d\n",x[0]); }
BFE> I1* i1 = { this };
BFE> I2* i2 = { this };
BFE>};
BFE>void fn(I1* i) { i->show(); }
BFE>void fn(I2* i) { i->print(); }
BFE>int main(int argc, char **argv) {
BFE> A a[1];
a->>x[0]=123;
BFE> fn(a->i1);
BFE> fn(a->i2);
BFE> return 0;
BFE>}
BFE>
BFE>
А потом так хоба:
http://coliru.stacked-crooked.com/a/9771187b1c11b3b6
A b = a[0];
b.x[0] = 456;
fn(b.i1); // show x0=123
fn(b.i2); // print x0=123
Хлопотно это, автореференсные объекты. И некрасиво.