C рдореЗрдВ рдереЛрдбрд╝реА рдЖрднрд╛рд╕реАрддрд╛ рдЬреЛрдбрд╝рдирд╛

рдпрд╣рд╛рдВ рдореБрдЭреЗ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдерд╛ рдХрд┐ C рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕рдорд╛рди рдХреИрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдореБрдЭреЗ рдХрдХреНрд╖рд╛рдУрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдЗрддрдиреА рдХрдореА рдереА рдХрд┐ рдореИрдВ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ рдХрд┐ C рдХреЛ C ++ рдХреЗ рдХрд░реАрдм рдХреИрд╕реЗ рд▓рд╛рдпрд╛ рдЬрд╛рдПред рдХреНрдпреЛрдВ? рдРрд╕реЗ рд╣реА рдЕрдкрдиреЗ рджрд┐рдорд╛рдЧ рдХреЛ рд╕реНрдЯреНрд░реЗрдЪ рдХрд░реЗрдВред
рдореБрдЦреНрдп рдЗрдЪреНрдЫрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереА: рдореИрдВ рд╕реА рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:

void print_name( Iface* ptr ) { ptr->print_name(); } void main() { A a; B b; print_name( &a ); //  "This is A object" print_name( &b ); //  "This is B object" } 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдП рдФрд░ рдмреА рдПрдХ рд╣реА (рдпрд╛ рд╢рд╛рдпрдж рдХрдИ) рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдУрдВ) рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЖрдк рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкрд░ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкреЙрдЗрдВрдЯрд░ рдХреА рдЖрдкреВрд░реНрддрд┐ рдХреА рдЧрдИ рдереАред

рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реБрдЖ (рдФрд░ рдХрд┐рд╕реА рддрд░рд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ) рдФрд░ рдЬреЛ рд╕реА ++ рдореЗрдВ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд░рдЦрддрд╛ рд╣реВрдВ, рдореИрдВ рдмрд┐рд▓реНрд▓реА рд╕реЗ рдкреВрдЫрддрд╛ рд╣реВрдВред




рдХреНрдпрд╛ рддреИрдпрд╛рд░ рд╣реИ?


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдореИрдВ рдПрдХрдорд╛рддреНрд░ рдРрд╕рд╛ рдЪрддреБрд░ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реВрдВред рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рддрд░реАрдХреЛрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рд╕реЗ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдо рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред

рдРрд╕реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдиреБрдХрд╕рд╛рди рдХреНрдпрд╛ рд╣реИрдВ?



рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВрдЧреЗ?


рдПрдХ рдЕрд▓рдЧ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрдЬрд╛рдп, рдЬреЛ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдбрд╛рд▓реЗрдВрдЧреЗред рдФрд░ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред
рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ "рд╡рд┐рд░рд╛рд╕рдд" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рддрд░реАрдХреЗ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдХреЗ рддрд░реАрдХреЗ, рдЖрджрд┐ рдбрд╛рд▓реЗрдВрдЧреЗред

рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдЬреЛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд╣рд▓реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдПрдХ рд╕рдВрд░рдЪрдирд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдкрддреЗ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдЗрд╕ рдкрддреЗ рдХреА рднрд░рдкрд╛рдИ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣рд╛рдВ рдиреБрдХрд╕рд╛рди рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдпрд╛ рддреЛ рдкреИрдХреЗрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдСрдлрд╕реЗрдЯ рдХреЛ рдкрд╣рдЪрд╛рдирдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рджрд┐рдпрд╛: рдореИрдВрдиреЗ рд╕реНрдХреЛрд░ рдХрд┐рдпрд╛ рдФрд░ рд╕реЛрдЪрд╛ рдХрд┐ рд╕реВрдЪрдХ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдВрд░реЗрдЦрдг рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реЗрдбрд░ рдФрд░ VS2010 рдХрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реА рдореЛрдб рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреА рдЧрдИ рд╣реИред

рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ!


рдЗрдВрдЯрд░рдлреЗрд╕

рдЗрд╕рд▓рд┐рдП, рд╣рдо рджреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред
рдкрд╣рд▓рд╛, base_iface , рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред
рджреВрд╕рд░рд╛, sizible_iface , рдЖрдкрдХреЛ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдкрддрд╛ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рджреВрд░ рдХреА рдХреМрдбрд╝реА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд░реЗрдВрдЧреЗред
base_iface.h
 #pragma once typedef struct base_iface* base_iface_ptr; typedef const char* (*get_name_func_ptr)( base_iface_ptr ); struct base_iface { get_name_func_ptr get_name; }; typedef struct base_iface base_iface; 

sizible_iface.h
 #pragma once typedef struct sizible_iface* sizible_iface_ptr; typedef unsigned int (*get_size_func_ptr)( sizible_iface_ptr ); struct sizible_iface { get_size_func_ptr get_size; }; typedef struct sizible_iface sizible_iface; 


рдХрдХреНрд╖рд╛рдПрдВ

рд╣рдо рджреЛ рд╕рдВрд░рдЪрдирд╛рдПрдБ рдмрдирд╛рддреЗ рд╣реИрдВ, point_t рдФрд░ d3_point_t , рдЬреЛ рдХреНрд░рдорд╢рдГ рджреЛ-рдЖрдпрд╛рдореА рдФрд░ рддреАрди-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдореЗрдВ рдПрдХ рдмрд┐рдВрджреБ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрди рд╕рдВрдХреЗрдд рд╣реЛрддреЗ рд╣реИрдВ: "рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ", "рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ" рдФрд░ "рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ"ред

рдкрд╣рд▓рд╛ рдкреЙрдЗрдВрдЯрд░ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдмреЗрд╕_рдлреИрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ "рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕" рд╣реИред
рджреВрд╕рд░рд╛ рд╕реВрдЪрдХ рдПрдХ рдЖрднрд╛рд╕реА рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ sizible_iface рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА "рд╡рд┐рд░рд╛рд╕рдд" рд╣реИред
рддреАрд╕рд░рд╛ рдкреЙрдЗрдВрдЯрд░ рдПрдХ рдирд┐рдпрдорд┐рдд рддрд░реАрдХрд╛ рд╣реИ, рд╡рд░реНрдЪреБрдЕрд▓ рдирд╣реАрдВред

рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдлрд╝рд╛рдЗрд▓реЗрдВ рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:
point.h
 #pragma once typedef struct point_t* point_ptr; typedef void (*point_print_coordinates_func)( point_ptr ); struct point_t //  base_iface  sizible_iface { // " " get_name_func_ptr get_name; get_size_func_ptr get_size; //  "" point_print_coordinates_func print_coordinates; //  int x; int y; }; typedef struct point_t point_t; //  point_t point_init( int x, int y ); //     point_ptr  base_iface_ptr base_iface_ptr point_to_base_iface( point_ptr ptr ); //     point_ptr  sizible_iface_ptr sizible_iface_ptr point_to_sizible_iface( point_ptr ptr ); 

3d_point.h
 #pragma once typedef struct d3_point_t* d3_point_ptr; typedef void (*d3_point_print_coordinates_func)( d3_point_ptr ); struct d3_point_t //  base_iface  sizible_iface { //  "" d3_point_print_coordinates_func print_coordinates; // " " get_name_func_ptr get_name; get_size_func_ptr get_size; //  int x; int y; int z; }; typedef struct d3_point_t d3_point_t; //  d3_point_t d3_point_init( int x, int y, int z ); //     d3_point_ptr  base_iface_ptr base_iface_ptr d3_point_to_base_iface( d3_point_ptr ptr ); //     d3_point_ptr  sizible_iface_ptr sizible_iface_ptr d3_point_to_sizible_iface( d3_point_ptr ptr ); 


рдПрдХ 3D рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рдЖрднрд╛рд╕реА "рддрд░реАрдХреЛрдВ" рдХреА рдЕрджрд▓рд╛-рдмрджрд▓реА рдХреА рдХрд┐ рдХреИрд╕реЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдкрд░ рдЖрднрд╛рд╕реАрддрд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ (рдЕрдкрдиреЗ рддрддреНрд╡реЛрдВ рдХреЛ рд░рдЦрдиреЗ рдореЗрдВ рд╕рдорд╛рди рдирд╣реАрдВ)ред

рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдкреЙрдЗрдВрдЯ_ рдЯреА * рдФрд░ рдбреА 3_ рдкреЙрдЗрдВрдЯ_ рдЯреА * рд╕реЗ рдмреЗрд╕_рдЖрдИрдПрдлрдПрд╕ * рдФрд░ рд╕рд┐рдЬрд┐рдмрд▓_рдЖрдИрдПрдлрдПрд╕ * рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕реЗ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд▓реЗ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдмрд┐рдВрджреБ_ рдФрд░ d3_point_t рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
point.s
 #include "std.h" static point_ptr base_iface_to_point( base_iface_ptr ptr ); //  " "  base_iface static const char* point_get_name( base_iface_ptr ptr ) { static const char* null_point_ptr = "Null point"; static const char* some_point_ptr = "Some point"; point_ptr casted_ptr = base_iface_to_point( ptr ); const char* result = null_point_ptr; if( casted_ptr->x || casted_ptr->y ) { result = some_point_ptr; } return result; } static point_ptr sizible_iface_to_point( sizible_iface_ptr ptr ); //  " "  sizible_iface static unsigned int point_get_size( sizible_iface_ptr ptr) { point_ptr casted_ptr = sizible_iface_to_point( ptr ); unsigned int size = (unsigned int)( sizeof( casted_ptr->x ) + sizeof( casted_ptr->y ) ); return size; } //   ""  point_t static void point_print_coordinates( point_ptr ptr ) { printf( "x = %u, y = %u\n", ptr->x, ptr->y ); } //  point_t //       (private)  point_t point_init( int x, int y ) { point_t point; point.get_name = point_get_name; point.get_size = point_get_size; point.print_coordinates = point_print_coordinates; point.x = x; point.y = y; return point; } //       enum { num_get_name_offset = 0, num_get_size_offset = sizeof( get_name_func_ptr ), }; //    static point_ptr base_iface_to_point( base_iface_ptr ptr ) { return (point_ptr)( (char*)ptr - num_get_name_offset ); } base_iface_ptr point_to_base_iface( point_ptr ptr ) { return (base_iface_ptr)( (char*)ptr + num_get_name_offset ); } static point_ptr sizible_iface_to_point( sizible_iface_ptr ptr ) { return (point_ptr)( (char*)ptr - num_get_size_offset ); } sizible_iface_ptr point_to_sizible_iface( point_ptr ptr ) { return (sizible_iface_ptr)( (char*)ptr + num_get_size_offset ); } 

3d_point.c
 #include "std.h" static d3_point_ptr base_iface_to_d3_point( base_iface_ptr ptr ); //  " "  base_iface static const char* d3_point_get_name( base_iface_ptr ptr ) { static const char* null_point_ptr = "Null 3D point"; static const char* some_point_ptr = "Some 3D point"; d3_point_ptr casted_ptr = base_iface_to_d3_point( ptr ); const char* result = null_point_ptr; if( casted_ptr->x || casted_ptr->y || casted_ptr->z ) { result = some_point_ptr; } return result; } static d3_point_ptr sizible_iface_to_d3_point( sizible_iface_ptr ptr ); //  " "  sizible_iface static unsigned int d3_point_get_size( sizible_iface_ptr ptr) { d3_point_ptr casted_ptr = sizible_iface_to_d3_point( ptr ); unsigned int size = (unsigned int) ( sizeof( casted_ptr->x ) + sizeof( casted_ptr->y ) + sizeof( casted_ptr->z ) ); return size; } //   ""  d3_point_t static void d3_point_print_coordinates( d3_point_ptr ptr ) { printf( "x = %u, y = %u, z = %u\n", ptr->x, ptr->y, ptr->z ); } //  d3_point_t //       (private)  d3_point_t d3_point_init( int x, int y, int z ) { d3_point_t point; point.get_name = d3_point_get_name; point.get_size = d3_point_get_size; point.print_coordinates = d3_point_print_coordinates; point.x = x; point.y = y; point.z = z; return point; } //       enum { num_get_name_offset = sizeof( d3_point_print_coordinates_func ), num_get_size_offset = num_get_name_offset + sizeof( get_name_func_ptr ), }; //    static d3_point_ptr base_iface_to_d3_point( base_iface_ptr ptr ) { return (d3_point_ptr)( (char*)ptr - num_get_name_offset ); } base_iface_ptr d3_point_to_base_iface( d3_point_ptr ptr ) { return (base_iface_ptr)( (char*)ptr + num_get_name_offset ); } static d3_point_ptr sizible_iface_to_d3_point( sizible_iface_ptr ptr ) { return (d3_point_ptr)( (char*)ptr - num_get_size_offset ); } sizible_iface_ptr d3_point_to_sizible_iface( d3_point_ptr ptr ) { return (sizible_iface_ptr)( (char*)ptr + num_get_size_offset ); } 


рддреЛ, рд╕рднреА рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╡рд┐рдирд┐рд░реНрджреЗрд╢рдХ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдмрд╛рд╣рд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЕрджреГрд╢реНрдп рдмрдирд╛рддрд╛ рд╣реИред

рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рддреБрдЪреНрдЫ рд╣реИ: рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рд╣рдо C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, "рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ" рдХреА рд╕рд╛рдордЧреНрд░реА рдХреБрдЫ рд╣рдж рддрдХ рддрдирд╛рд╡рдкреВрд░реНрдг рд╣реИред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрди "рддрд░реАрдХреЛрдВ" рдХреЗ рдЕрдВрджрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдЖрднрд╛рд╕реАрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред
рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдХрд┐ рдПрдХ рдкреНрд░реА-рдХреИрдкреНрдб рд╣реЗрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдПрдЧреА:
std.h
 #pragma once // system #include "stdio.h" // program #include "base_iface.h" #include "sizible_iface.h" #include "point.h" #include "3d_point.h" 

std.s
 #include "std.h" 


рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдЦреБрдж:
main.c
 #include "std.h" // ,      base_iface void print_name( base_iface_ptr ptr ) { printf( "name = \"%s\"\n", ptr->get_name( ptr ) ); } // ,      sizible_iface void print_size( sizible_iface_ptr ptr ) { printf( "size = %u\n", ptr->get_size( ptr ) ); } int main( int argc, const char* argv[] ) { //    point_t null_point = point_init( 0, 0 ); point_t some_point = point_init( 1, 5 ); d3_point_t d3_null_point = d3_point_init( 0, 0, 0 ); d3_point_t d3_some_point = d3_point_init( 0, 1, 0 ); //      print_name( point_to_base_iface( &null_point ) ); //      print_size( point_to_sizible_iface( &null_point ) ); //    null_point.print_coordinates( &null_point ); puts( "\n" ); //       print_name( point_to_base_iface( &some_point ) ); print_size( point_to_sizible_iface( &some_point ) ); some_point.print_coordinates( &some_point ); puts( "\n" ); print_name( d3_point_to_base_iface( &d3_null_point ) ); print_size( d3_point_to_sizible_iface( &d3_null_point ) ); d3_null_point.print_coordinates( &d3_null_point ); puts( "\n" ); print_name( d3_point_to_base_iface( &d3_some_point ) ); print_size( d3_point_to_sizible_iface( &d3_some_point ) ); d3_some_point.print_coordinates( &d3_some_point ); puts( "\nPress any key to exit...\n" ); getchar(); return 0; } 


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИрдВ: рд╣рдордиреЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИ рдЬреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╣рдорд╛рд░реА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖


VS2010 (рд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ) рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:
 name = "Null point" size = 8 x = 0, y = 0 name = "Some point" size = 8 x = 1, y = 5 name = "Null 3D point" size = 12 x = 0, y = 0, z = 0 name = "Some 3D point" size = 12 x = 0, y = 1, z = 0 Press any key to exit... 

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ "рд╡рд░реНрдЪреБрдЕрд▓ рдЗрдВрдЯрд░рдлреЗрд╕" рд╣реИ, "рдорд▓реНрдЯреАрдкрд▓ рдЗрдирд╣реЗрд░рд┐рдЯреЗрдВрд╕" рд╣реИ рдФрд░ рдкреНрд░реВрдл-рдСрдл-рдХреЙрдиреНрд╕реЗрдкреНрдЯ рд╣реИ! рд╕рдЪ рд╣реИ, рдХреЛрдб рдЙрддрдирд╛ рд╕реБрдВрджрд░ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдЬрд┐рддрдирд╛ рд╣рдо рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЙрд╕ рдХрд╛рдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП C ++ рдореЗрдВ рдХрд░рддрд╛ рд╣реИ:

рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдВ рдЗрд╕рд╕реЗ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдпрд╣ рдЖрднрд╛рд╕реАрддрд╛ рдХрд╣рд╛рдВ рд▓рд╛рдЧреВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХреГрддрд┐ рдореЗрдВ рднрд┐рдиреНрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ, рд▓реЗрдХрд┐рди рд╕рдорд╛рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ред рдпрд╛ рдХреБрдЫред
рдпрд╛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдореЗрдВ, рдЬрдм рдЖрдк рд╣реИрд╢ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдо рддреМрд░ рдкрд░ рджреЛ рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рдПрдХ рд╣реИрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдареАрдХ рд╣реИ, рдмрд╕ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ ("ред" рдСрдкрд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рджреЗрдЦреЗрдВ, рдЬреЛ рдЗрд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдФрд░ рдПрдХ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде ("рддрд░реАрдХреЗ") рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдореБрдЭреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред

рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рд╣рд┐рддреНрдп


  1. ANSI-C ( xana4ok ) рдХреЗ рд╕рд╛рде рдСрдмреНрдЬреЗрдХреНрдЯ рдУрд░рд┐рдПрдВрдЯреЗрдб рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ
  2. рд╕реБрдВрджрд░ рдХреЛрдб (рдЕрдЧреНрд░рдгреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреИрд╕рд╛ рд╕реЛрдЪрддреЗ рд╣реИрдВ), рдЕрдзреНрдпрд╛рдп 16, рдж рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдбреНрд░рд╛рдЗрд╡рд░ рдореЙрдбрд▓: рдЧреНрд░реЗрдЧ рдХреНрд░реЛрд╣-рд╣рд╛рд░реНрдЯрдореИрди ( рдмреБрд░реНрдЬрдИ ) рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн

Source: https://habr.com/ru/post/In155439/


All Articles