c++ struct中只有一个变量有啥意义

方便以后扩展举个栗子...当时写绘图软件...在图面上画散点...我直接用了std::vector\u0026lt;point\u0026gt; 存储点集...后来过了一个月需求扩展了,得支持隐藏哟...于是我用了std::vector\u0026lt;std::pair\u0026lt;point, bool\u0026gt;\u0026gt;面对200多个编译错误,我忍了...又过了一个月...点的样式不一样哟...有的点是五角星,有的点是圆哦...我只好改成class {point, bool, type}std::vectort\u0026lt;class\u0026gt;这次又一千多个编译错误...如果我一开始就用class!!!!~~~~-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-随手举个栗子,不要对号入座...
■网友
类型安全
■网友
我觉得:typedef struct TypeA{ int a_val;} NewTypeforsomereason;更可能以这样的方式被使用:... interface1(NewTypeforsomereason *handle, ...);... interface2(NewTypeforsomereason *handle, ...);... interface3(NewTypeforsomereason *handle, ...);我举两个类似的例子,题主思考一下:1. // winnt.h#ifdef STRICTtypedef void *HANDLE;#if 0 \u0026amp;\u0026amp; (_MSC_VER \u0026gt; 1000)#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name#else#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name#endif#elsetypedef PVOID HANDLE;#define DECLARE_HANDLE(name) typedef HANDLE name#endiftypedef HANDLE *PHANDLE;// windef.hDECLARE_HANDLE(HBITMAP);DECLARE_HANDLE(HBRUSH);DECLARE_HANDLE(HDC);DECLARE_HANDLE(HGLRC); // OpenGLDECLARE_HANDLE(HDESK);DECLARE_HANDLE(HENHMETAFILE);把 HDC 的定义展开后,就是:struct HDC__ { int unused; };typedef struct HDC__ *HDC;和题主的代码段是不是有异曲同工之妙?从表象上来看,struct HDC__ 的 unused 成员是不会被用到的。struct HDC__ 只是作为一个“抽象”的类型(概念)而存在的,我们可以称之为“句柄”。如果这样定义 HDC:typedef void *HDC;是不是就丧失了前面几位大婶所说的 type safety?2. sqlite3 的 C 语言接口以类似这样的方式实现:// sqlite3.htypedef struct sqlite3 sqlite3;typedef struct sqlite3_stmt sqlite3_stmt;SQLITE_API sqlite3_stmt *SQLITE_STDCALL sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt);// sqlite3.cstruct sqlite3 { ...};SQLITE_API sqlite3_stmt *SQLITE_STDCALL sqlite3_next_stmt(sqlite3 *pDb, sqlite3_stmt *pStmt){ ...}这里,头文件中把两个 incomplete types 的指针类型作为接口 sqlite3_next_stmt 的参数类型。在内部实现(sqlite3.c)中:(1) 在 sqlite3_next_stmt 之前,struct sqlite3 被给予了一个“名分”。它作为一个“抽象”的句柄,管理了一些内部实现用到的资源。所有使用 SQLite 中接口的客户端程序,都只能通过 sqlite3 * 类型的句柄来操作。而 struct sqlite3 究竟是怎么实现的,无可奉告!当然,客户端程序猿也不必关心 struct sqlite3 是究竟如何实现的。这种“封装”为以后的扩展/重构(例如:修改内部实现)提供了便利。(2) struct sqlite3_stmt 在 sqlite3.c 中无对应的具体定义。它用于替代 void *,以提升 type safety。
■网友
可拓展
■网友
方便以后往里面加新的变量


    推荐阅读