秀逗了,一个很简单的C++程序,一下有些无法理解了

「已注销」
博客专家认证
2017-06-01 12:07:20
这是一个程序的截取片段:

程序是没有错误的:是一个专业程序中的代码片段,有些不是很理解,因为Module不是单实例的,这种用法看着有些奇怪。

请诸位高人帮忙给出解释,写了这么多年C++居然看到这个代码有些秀逗了。
...全文
834 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhujinqiang 2017-06-08
  • 打赏
  • 举报
回复
意思就是指向类成员的指针是啊?
赵4老师 2017-06-05
  • 打赏
  • 举报
回复
http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数
「已注销」 2017-06-03
  • 打赏
  • 举报
回复
引用 26 楼 zanfeng 的回复:
代码有上下文你应该知道是干啥用的。应该是实现GOF工厂模式之类的。
:) 这段代码是最底层核心代码,被几层继承后已经很难梳理出调用关系,而且目标程序极大(整个库上G了,单一模块都数百M),想用GDB跟踪一下都有些怕怕。所以,最后梳理后写出一份干净的代码,终于搞清楚这段代码的意思了。 感谢版主的很精准回复,实际坛子里已经有不少高人都在之前找到了方向。只是觉得技术本来就是一张窗户纸,实际是很简单的,但当时确实想了好长时间,甚至以为是C++11的用法 ----- 确实也是太无知的想法。 动动手仔细梳理一下,实际很简单的。 :)
「已注销」 2017-06-03
  • 打赏
  • 举报
回复
引用 24 楼 zdg20042586 的回复:
不理解,求解释哈...
看18楼和19楼,有详细解释
「已注销」 2017-06-03
  • 打赏
  • 举报
回复
引用 27 楼 dong364 的回复:
哎。。。 这样写感觉没意思 让别人看不懂又迷惑的代码 读过一些优良的开源代码 没见过有这么晦涩冷僻的语法
这段代码是大名鼎鼎的LLVM中的核心代码,该开源代码被Apple和Google/M$广泛使用 ----- 绝对算上最顶尖的开源程序 :)
dong364 2017-06-02
  • 打赏
  • 举报
回复
哎。。。 这样写感觉没意思 让别人看不懂又迷惑的代码 读过一些优良的开源代码 没见过有这么晦涩冷僻的语法
zdg20042586 2017-06-02
  • 打赏
  • 举报
回复
不理解,求解释哈...
足球中国 2017-06-02
  • 打赏
  • 举报
回复
代码有上下文你应该知道是干啥用的。应该是实现GOF工厂模式之类的。
ljheee 2017-06-02
  • 打赏
  • 举报
回复
代码 是可以 编 译通过 的。
dong364 2017-06-01
  • 打赏
  • 举报
回复
就给的信息来看,感觉编译都过不了
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
引用 22 楼 lianshaohua 的回复:
[quote=引用 21 楼 tomsoft 的回复:] 写了这么多,版主射精
可以好好看一下《c++ primer》,记得书中有讲到指向类成员的指针。[/quote] 感谢,下午还专门看了C++ Primer(5th),只是一直在想这个是不是C++ 11/14,有时间再仔细看看,总记得侯捷的哪本书有。
ztenv 版主 2017-06-01
  • 打赏
  • 举报
回复
引用 21 楼 tomsoft 的回复:
写了这么多,版主射精
可以好好看一下《c++ primer》,记得书中有讲到指向类成员的指针。
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
引用 18 楼 lianshaohua 的回复:
[quote=引用 15 楼 tomsoft 的回复:] 赵老师厉害:RTTI都上来了,哈哈~~~ 赵老师和版主厉害,已经离答案不远了,但是有一点,getSublistAccess是static的,即没有实例化的this指针。 :) 坛子里高人不少,小弟看来要公布答案了。
获取类成员的地址时,不需要类对象的this指针,只是获取的一个地址而已,获取类成员的地址后,可以通过类对象或类对象的指针/引用来访问; 你这里的意思已经很明显了,通过getSublistAccess()的静态方式访问私有成员变量IFuncList;[/quote] 版主英明,实际那个例子基本上已经说明了多数问题。结贴散分
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
结贴了,群里高人太多了;实际大家的方向基本已经猜到了,小弟也不好再这里继续装深沉了。大家注意看我在11楼的那个函数代码,那是个简化的代码;实际这个代码基本已经说明了大部分的问题了。 补上调用部分: 注意这个代码: static IFuncListType Module::*getSublistAccess(void) { return &Module::IFuncList; } 这段代码是非常具有迷惑性的: 1)IFuncList并不是static变量,他是Module中的某个成员变量;理论上&Module::IFuncList; 返回指向这个成员变量的指针:这是楼上各位已经说中的部分;但是,这里没有this指针,所以严格讲他不会返回这个指针。 2)因为getSublistAccess是static,因此,我们实际上用test.getSublistAccess和Module::getSublistAccess是一样的,按照C++的规定,在static中即使指定这个test,其实也没有this指针 好了问题重新回到原点了,那个getSublistAccess返回的是什么“鬼“:依照C++语法应该是指针的。因为这里没有this指针,实际此时返回的是相对nulptr的位置,即实际是偏移值,具体在这个测试用例中是数字4(VC++ 2015);因此:test.*(test.getSublistAccess())返回的是IFuncListType的一个引用。 这个程序虽然已经搞懂了,但是为什么这样用还是不是很清楚:至少之前从来没有这么写过程序,仔细研究了原始程序的使用方式: 因为,Par可能是继承于多个类似的Module的类,而该程序又不希望用户知道IFunctionList这件事情,也许是为了统一处理方式,其返回相关的基类的引用给其他程序使用;(总觉得有些牵强附会,还请各位大大指正)
ztenv 版主 2017-06-01
  • 打赏
  • 举报
回复
引用 15 楼 tomsoft 的回复:
赵老师厉害:RTTI都上来了,哈哈~~~ 赵老师和版主厉害,已经离答案不远了,但是有一点,getSublistAccess是static的,即没有实例化的this指针。 :) 坛子里高人不少,小弟看来要公布答案了。
获取类成员的地址时,不需要类对象的this指针,只是获取的一个地址而已,获取类成员的地址后,可以通过类对象或类对象的指针/引用来访问; 你这里的意思已经很明显了,通过getSublistAccess()的静态方式访问私有成员变量IFuncList;
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
引用 16 楼 ljz2173 的回复:
前面定义的typedef是个什么东西,难道要把类的符号表取出来?
和typedef即那个模板没有关系,看我之后那个简化的例子
龙江小李 2017-06-01
  • 打赏
  • 举报
回复
前面定义的typedef是个什么东西,难道要把类的符号表取出来?
「已注销」 2017-06-01
  • 打赏
  • 举报
回复
赵老师厉害:RTTI都上来了,哈哈~~~ 赵老师和版主厉害,已经离答案不远了,但是有一点,getSublistAccess是static的,即没有实例化的this指针。 :) 坛子里高人不少,小弟看来要公布答案了。
赵4老师 2017-06-01
  • 打赏
  • 举报
回复
//C++ Operators
//  Operators specify an evaluation to be performed on one of the following:
//    One operand (unary operator)
//    Two operands (binary operator)
//    Three operands (ternary operator)
//  The C++ language includes all C operators and adds several new operators.
//  Table 1.1 lists the operators available in Microsoft C++.
//  Operators follow a strict precedence which defines the evaluation order of
//expressions containing these operators.  Operators associate with either the
//expression on their left or the expression on their right;    this is called
//“associativity.” Operators in the same group have equal precedence and are
//evaluated left to right in an expression unless explicitly forced by a pair of
//parentheses, ( ).
//  Table 1.1 shows the precedence and associativity of C++ operators
//  (from highest to lowest precedence).
//
//Table 1.1   C++ Operator Precedence and Associativity
// The highest precedence level is at the top of the table.
//+------------------+-----------------------------------------+---------------+
//| Operator         | Name or Meaning                         | Associativity |
//+------------------+-----------------------------------------+---------------+
//| ::               | Scope resolution                        | None          |
//| ::               | Global                                  | None          |
//| [ ]              | Array subscript                         | Left to right |
//| ( )              | Function call                           | Left to right |
//| ( )              | Conversion                              | None          |
//| .                | Member selection (object)               | Left to right |
//| ->               | Member selection (pointer)              | Left to right |
//| ++               | Postfix increment                       | None          |
//| --               | Postfix decrement                       | None          |
//| new              | Allocate object                         | None          |
//| delete           | Deallocate object                       | None          |
//| delete[ ]        | Deallocate object                       | None          |
//| ++               | Prefix increment                        | None          |
//| --               | Prefix decrement                        | None          |
//| *                | Dereference                             | None          |
//| &                | Address-of                              | None          |
//| +                | Unary plus                              | None          |
//| -                | Arithmetic negation (unary)             | None          |
//| !                | Logical NOT                             | None          |
//| ~                | Bitwise complement                      | None          |
//| sizeof           | Size of object                          | None          |
//| sizeof ( )       | Size of type                            | None          |
//| typeid( )        | type name                               | None          |
//| (type)           | Type cast (conversion)                  | Right to left |
//| const_cast       | Type cast (conversion)                  | None          |
//| dynamic_cast     | Type cast (conversion)                  | None          |
//| reinterpret_cast | Type cast (conversion)                  | None          |
//| static_cast      | Type cast (conversion)                  | None          |
//| .*               | Apply pointer to class member (objects) | Left to right |
//| ->*              | Dereference pointer to class member     | Left to right |
//| *                | Multiplication                          | Left to right |
//| /                | Division                                | Left to right |
//| %                | Remainder (modulus)                     | Left to right |
//| +                | Addition                                | Left to right |
//| -                | Subtraction                             | Left to right |
//| <<               | Left shift                              | Left to right |
//| >>               | Right shift                             | Left to right |
//| <                | Less than                               | Left to right |
//| >                | Greater than                            | Left to right |
//| <=               | Less than or equal to                   | Left to right |
//| >=               | Greater than or equal to                | Left to right |
//| ==               | Equality                                | Left to right |
//| !=               | Inequality                              | Left to right |
//| &                | Bitwise AND                             | Left to right |
//| ^                | Bitwise exclusive OR                    | Left to right |
//| |                | Bitwise OR                              | Left to right |
//| &&               | Logical AND                             | Left to right |
//| ||               | Logical OR                              | Left to right |
//| e1?e2:e3         | Conditional                             | Right to left |
//| =                | Assignment                              | Right to left |
//| *=               | Multiplication assignment               | Right to left |
//| /=               | Division assignment                     | Right to left |
//| %=               | Modulus assignment                      | Right to left |
//| +=               | Addition assignment                     | Right to left |
//| -=               | Subtraction assignment                  | Right to left |
//| <<=              | Left-shift assignment                   | Right to left |
//| >>=              | Right-shift assignment                  | Right to left |
//| &=               | Bitwise AND assignment                  | Right to left |
//| |=               | Bitwise inclusive OR assignment         | Right to left |
//| ^=               | Bitwise exclusive OR assignment         | Right to left |
//| ,                | Comma                                   | Left to right |
//+------------------+-----------------------------------------+---------------+
ztenv 版主 2017-06-01
  • 打赏
  • 举报
回复
指向类成员的指针
加载更多回复(11)

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧