问题标签 [non-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 投票
2 回答
294 浏览

c++ - 选择使函数成为成员、非成员、私有、公共等

我搜索了有关成员函数和非成员函数之间区别的描述,虽然我仍然很困惑,但我想我会举一个例子来为我澄清一下。这是我们的老师给我们作为学习材料的旧测试中的一个问题:

假设我们有一个 main() 程序,它使用我们文本中的 queue2.h 和 node2.h 模板实现,创建一个字母队列(队列字母)。

  1. 我们想编写一个流运算符来将字符串(事物)的所有字符插入队列(字母 << 事物;)。

(b) 我们应该把这个 << 设为会员还是非会员?私人的、公共的、朋友的,还是两者都不是?

  1. 我们想提供一个工具(称为 Get_Front),它返回这个字符队列的头指针,以便将来使用链表工具包进行操作。
    因此,当一切编码正确时,list_head_insert(head_ptr, '2') 将在我的队列前面放置一个 '2'。

(b) 我们应该让 Get_Front 成为成员还是非成员?私人的、公共的、朋友的,还是两者都不是?

我猜第一个应该被实现为具有朋友功能的非成员,但我不确定具体为什么?

非常感谢!

0 投票
3 回答
667 浏览

c++ - C++ 自由函数

我有以下代码

我需要使用免费功能来显示大约 60 个星号,其中我有 cout << endl。我遵循了我给出的示例,但无法使其正常工作。

下面的代码是我得到的关于自由函数外观的示例。

更新a:得到它的工作,感谢大家的帮助。我重写了 free 函数并再次在 main 上方添加了 asterisks() 并且它起作用了。一定是自由功能中的某些东西导致它无法工作。

0 投票
2 回答
951 浏览

c++ - 如何使用 dwarf 确定非成员函数中的局部静态变量

我试图使用 dwarf 来比较两个 c++ 文件,但是当我在非成员函数中获取局部变量时遇到了问题。考虑以下代码 -

如果我在没有修饰符的情况下编译它,static我会得到以下侏儒信息 -

但是如果我static修饰符编译它,我会得到-

现在据我所知,这些文件之间只有一个真正的区别——DW_AT_location变量 j 的属性上的字节块大小不同(这就是为什么DW_AT_sibling函数 f 的标签中的属性不同,所以我不算)。我认为这在某种程度上意味着静态,但我不知道如何。

0 投票
1 回答
1905 浏览

c++ - 如何将方法添加到类(Helper 函数)?

如何在不改变现有类的上下文的情况下将自己的方法添加到现有类中。

例如 :

0 投票
3 回答
524 浏览

c++ - 同名成员函数的 ADL

情况是某些成员函数bar::Bar::frobnicate想利用 ADL 从某个未知名称空间中找到一个函数,该函数在一个具有相同名称的函数中。但是,它只能找到自己的名称。

测试用例

请注意,实际上,Bar是一个Foo不可知的模板;这只是可重现的最小测试用例)

结果是:

标准

我知道这是正确的编译器行为:

3.4.1 非限定名称查找[basic.lookup.unqual]

(...) 一旦找到名称 (...) 的声明,名称查找就会结束

并且只有不合格的查找失败后,依赖于参数的查找才起作用:

3.4.2 依赖于参数的名称查找[basic.lookup.argdep]

当函数调用 (5.2.2) 中的后缀表达式是非限定 ID 时,可能会搜索在通常的非限定查找 (3.4.1) 期间未考虑的其他命名空间

解决方法

我目前的解决方法是引入一个不定义冲突名称本身的特殊特征类:

或者这个更轻的版本:

问题

有没有比引入此类特征类更好的选择?

在这里明确限定调用foo::frobnicate(foo)不是一个选项,因为(如前所述)Bar该类实际上是一个模板,Foo并且不应仅适用于foo命名空间中的类型。

0 投票
2 回答
6660 浏览

c++ - 使用 GMOCK 在没有类文件的情况下模拟在 .cpp 中声明和定义的静态函数

这里静态函数在同一个文件file.cpp中声明和定义。我没有在这里包含静态函数的定义。现在使用GMock我需要模拟或测试 .h 和 .cpp 中定义的所有函数。

0 投票
1 回答
3383 浏览

c++ - c++ 后缀/前缀运算符重载为非成员函数

我正在编写自己的数组类作为练习。因为,我读到非成员函数实际上在某些方面比成员函数更好。(斯科特迈耶斯

我正在尝试尽可能多地编写非成员函数的运算符重载。运算符重载 + , - 作为非成员函数都可以正常工作。

但是,作为非成员函数的前缀/后缀运算符会产生问题(如果我使用范围解析并将它们设为成员函数,它们就可以正常工作)

我知道并非每个运算符重载都可以是成员函数。但是,我对为什么这两个不能是非成员函数感到困惑。我得到的错误是:

如果我将它们设为成员函数并允许 *this 数组 obj 以下列格式传递,这基本上可以解决。

但整件事是,我不想让它们首先成为成员函数!那么,是不是 pre/post fix 运算符不能/不应该被实现为非成员函数?

我想出的理由是,由于后缀/前缀是一元运算符,它们只有一个参数(通常是 *this)。因此,如果我希望编译器隐式提供 *this 指针并调用重载,则必须将它们实现为成员函数。

我的推理正确吗?如果不是,我如何将其实现为非成员函数?感谢您为我提供一些见解。

0 投票
4 回答
7393 浏览

c++ - 运算符重载和非成员函数 C++

我已经为复数编写了一个类,其中我重载了运算符 + 并且一切正常,但是我需要将其作为非成员函数来实现,我不确定如何或为什么这样做有好处。

这是我的代码.h:

.cpp:

任何有关如何将这些作为非成员函数的帮助将不胜感激!

0 投票
2 回答
352 浏览

c++ - C++ 运算符重载 - uni 测验答案看起来不对?

截屏

大家好

今年我们的uni coursenotes有一些错误,我只是在考试前复习测验,附图显示了“不能作为非成员运算符重载实现”的正确答案。

在这里发帖可能无法及时得到 uni 论坛的答复。是我误解了什么,还是下面的答案有误?

谢谢 :)

0 投票
1 回答
2239 浏览

c++ - 运算符重载 - 内联非成员函数

好的,所以我可以让我的代码正常工作,但是有些东西让我很烦。它与运算符重载和使非成员函数内联有关。这是一个实现复数对象的非常简单的程序:

包含在 Complex.h 中

...在 Complex.cc 中

最后在 plus_overload_test.cc

使用执行链接的生成文件使用 g++ 进行编译会产生错误:

如果我只是从 Complex.h 和 Complex.cc 中的 operator+ 之前删除“内联”,那么一切都会编译并按应有的方式工作。为什么 inline 修饰符会导致此错误?大家举个例子:

运算符重载

http://en.cppreference.com/w/cpp/language/operators

似乎建议对于重载二元运算符,函数应该是非成员和内联的。那么,当我将它们内联时,为什么会遇到错误呢?

而且,是的,我意识到 inline 修饰符可能是一个红鲱鱼,因为现代编译器应该注意这一点。但我仍然很好奇。

干杯!