问题标签 [member-functions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2897 浏览

c++ - 在成员函数内部调用虚函数

我正在阅读Bruce Eckel的《用 C++ 思考》 。在第 15 章(第 1 卷)的“构造函数内部虚函数的行为”标题下,他说

如果您在构造函数中并调用虚函数会发生什么?在一个普通的成员函数中,你可以想象会发生什么——虚拟调用在运行时被解析,因为对象不知道它是属于成员函数所在的类,还是从它派生的某个类。为了一致性,您可能认为这是在构造函数内部应该发生的事情。

在这里,Bruce 试图解释当您在对象的构造函数中调用虚函数时,不会表现出多态性,即只会调用当前类的函数,而不会是该函数的其他派生类版本。这是有效的,我可以理解,因为类的构造函数不会事先知道它是为它运行还是为其他衍生对象的创建运行。此外,如果这样做,它将在部分创建的对象上调用函数,这是灾难性的。

虽然我的困惑突然出现,因为他在第一句话中陈述了普通成员函数,他说虚拟调用将在运行时解决。但是等等,在一个类的任何成员函数中,当你调用另一个函数(无论是虚拟的还是非虚拟的)时,它自己的类版本只会被调用,对吧?例如

在上面的代码中,A::add()当调用到时subadd(),它总是会调用A::subadd(),同样适用B,对吧?那么“虚拟调用在运行时解决,因为对象不知道它属于成员函数所在的类,还是从它派生的某个类”是什么意思?

他是在通过基类指针的调用来解释它吗?(我真的很怀疑)在这种情况下,他不应该写“在普通成员函数中”;据我目前的理解,从同一类的另一个成员函数内部对成员函数的任何调用都不是多态的,如果弄错了,请纠正我。

0 投票
3 回答
5149 浏览

c++ - C++ 中单冒号“:”的重要性

可能重复:
构造函数中这个奇怪的冒号成员语法是什么?

我很少在常规代码中遇到类中的单个冒号,例如:

单冒号在这里有什么重要性?为什么在这里使用它?有时是强制性的吗?如果是在哪些情况下?

0 投票
7 回答
3295 浏览

c++ - 将 NULL 指针强制转换为对象并调用其成员函数之一是否有实际好处?

好的,所以我知道从技术上讲这是未定义的行为,但尽管如此,我在生产代码中不止一次看到过这种情况。如果我错了,请纠正我,但我也听说有些人使用这个“功能”作为当前 C++ 标准缺乏方面的某种合法替代品,即无法获取地址(嗯,成员函数的偏移量。例如,这是 PCRE(Perl 兼容的正则表达式)库的流行实现:

人们可以争论在这样的情况下利用这种语言的微妙之处是否有效,甚至是必要的,但我也看到它是这样使用的:

这工作得很好!它通过测试 的存在来避免空指针取消引用this,并且它不会尝试访问else块中的类成员。只要这些防护措施到位,它就是合法的代码,对吧?所以问题仍然存在:是否有一个实际的用例,可以从使用这种结构中受益?我特别关心第二种情况,因为第一种情况更多的是一种解决语言限制的方法。或者是吗?

PS。对 C 风格的演员表感到抱歉,不幸的是,如果可以的话,人们仍然喜欢少打字。

0 投票
5 回答
1261 浏览

c++ - 由特征实例化的类成员函数 [实际上是策略]

我不愿意说我想不通,但我想不通。我用谷歌搜索并搜索了 Stack Overflow,但结果是空的。

问题的抽象且可能过于模糊的形式是,如何使用特征模式来实例化成员函数? [更新:我在这里使用了错误的术语。它应该是“政策”而不是“特征”。特征描述现有的类。策略规定了合成类。]这个问题是在对我 10 多年前编写的一组多元函数优化器进行现代化改造时提出的。

优化器都通过选择一条远离当前最佳点的直线路径通过参数空间(“更新”),然后在该线上找到更好的点(“线搜索”),然后测试“完成” " 条件,如果没有完成,则迭代。

有不同的方法来进行更新、行搜索,以及可以想象的完成测试和其他事情。连连看。不同的更新公式需要不同的状态变量数据。例如,LMQN 更新需要一个向量,而 BFGS 更新需要一个矩阵。如果评估梯度很便宜,那么线搜索应该这样做。如果没有,它应该只使用函数评估。有些方法比其他方法需要更准确的线搜索。这些只是一些例子。

原始版本通过虚函数实例化了几种组合。通过设置在运行时测试的模式位来选择一些特征。呸。用#define 定义特征并用#ifdef 和宏定义成员函数将是微不足道的。但那是二十年前的事了。让我感到困扰的是,我无法找到一种非常棒的现代方式。

如果只有一个不同的特征,我可以使用奇怪的重复模板模式。但我认为没有办法将其扩展到任意特征组合。

我尝试使用boost::enable_if等。专业的状态信息很容易。我设法完成了这些功能,但只能求助于将this-pointer 作为参数的非友元外部函数。我什至从未想过如何让函数成为朋友,更不用说成员函数了。编译器(VC++ 2008)总是抱怨事情不匹配。我会大喊:“SFINAE,你这个白痴!” 但这个白痴可能是我。

也许标签调度是关键。我还没有深入了解。

当然有可能,对吧?如果是这样,最佳做法是什么?

更新:这是另一个解释它的尝试。我希望用户能够为自定义优化器填写订单(清单),例如从中文菜单中订购 - 一个来自 A 列,一个来自 B 列,等等。服务员,来自 A 列(更新程序) ,我将使用 Cholesky 分解酱更新 BFGS。请从 B 列(线搜索器)开始,我将进行三次插值线搜索,其 eta 为 0.4,rho 为 1e-4。ETC...

更新:好的,好的。这是我做过的游戏。我不情愿地提供它,因为我怀疑这是一种完全错误的方法。它在 vc++ 2008 下运行良好。

0 投票
3 回答
3191 浏览

c++ - C++ 中的 const 函数和接口

我将使用以下(简单的)接口作为示例:

逻辑规定GetName应该是const成员函数,而不应该是成员函数ChangeState

不过,到目前为止我看到的所有代码都没有遵循这个逻辑。也就是说,GetName在上面的示例中不会被标记为const成员函数。

这是懒惰/粗心还是有正当理由?我强迫我的客户const在逻辑上要求他们实现成员函数的主要缺点是什么?


编辑:感谢大家的回复。我认为这几乎是一致的:懒惰/无知是我所看到的原因。

0 投票
2 回答
746 浏览

oracle - 存储过程 PLS-00306 的参数数量

我在调用我的程序时遇到问题。甲骨文紧急

PLS-00306 错误:调用过程中的参数类型数量错误。

我的类型声明过程与下面的标题中的声明完全相同。如果我将它作为单独的程序运行它可以工作,当我在 ODCI 接口中工作以创建可扩展索引时,它会抛出 PLS-00306。

0 投票
2 回答
255 浏览

f# - F#:有什么方法可以将成员函数用作未绑定函数?

有没有办法提取成员函数,并将它们用作 F# 函数?我希望能够编写以下内容:

如果你 [让] 上面的代码有效

0 投票
2 回答
754 浏览

c++ - 我是 C++ 新手。请帮我处理链接列表(要添加哪些功能)?

亲爱的大家;

嗨,我只是 C++ 的初学者;请帮助我理解:

链表类中应该有哪些功能?我认为应该有重载的运算符 << 和 >>; 请帮助我改进代码(样式、错误等) 感谢您的提前。伊格尔。

编辑:这只是第一阶段,下一个阶段将(希望)带有模板。

请查看整数列表的小代码(包含 MyNODE.h 和 ListDriver1.cpp);我的节点.h

测试驱动程序:

0 投票
5 回答
5770 浏览

c++ - 对容器中所有元素的成员函数结果求和的最佳方法是什么?

假设我有以下对象:

size获取a 中所有对象的总和的最佳方法是什么(最可维护、最易读等)vector<Foo>?我会发布我的解决方案,但我对更好的想法感兴趣。

更新:

到目前为止,我们有:

  • std::accumulate 和一个仿函数
  • std::accumulate 和 lambda 表达式
  • 普通的 for 循环

还有其他可行的解决方案吗?你能用boost::bindor做一些可维护的东西std::bind1st/2nd吗?

0 投票
4 回答
611 浏览

c++ - 为什么我不能在一个类中声明一个朋友是另一个类的私有成员?

给定以下代码:

为什么Screen类不能声明WindowMgr::relocateScreen成员函数为友元?Screen不想使用另一个类的这个私有成员函数,而只是希望该函数能够访问它自己的私有成员。

relocateScreen如果仅打算在WindowMgr类中使用,则将函数公开可能是糟糕的设计。同样,如果不打算在任何其他情况下访问私有成员,那么结交Screenof 的朋友可能是糟糕的设计。WindowMgrWindowMgr

我在哪里错了?什么是正确的方法?我是在自欺欺人吗?