问题标签 [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 投票
3 回答
4151 浏览

c++ - 将 operator== 重载为带有模板参数的自由函数的语法是什么?

我有一组多态类,例如:

以及比较它们的免费功能:

我正在设计一个可复制的包装类,它允许我在 STL 映射中使用类RedGreen作为键,同时保留它们的多态行为。

我希望该Copy<Apples>类型尽可能可互换Apples。还有一些函数我必须添加到上面的Copy类中,但现在我正在为 开发一个免费函数operator==,如下所示:

这是我的测试代码的一部分:

但是编译器告诉我

如何让它识别上面的 operator==?我怀疑答案可能是在某处添加一些隐式转换代码,但我不确定该怎么做。

0 投票
1 回答
950 浏览

c++ - begin(container) 和 end(container) 是否标准化?

非成员函数模板是 C++0x 的一部分吗begin(container)end(container)如果是这样,它们位于哪个头文件中?

0 投票
3 回答
5033 浏览

c++ - 静态、非成员或静态非成员函数?

每次我有一些“实用”方向的功能时,我最终都会想知道哪个选项是最好的。例如,打印消息结构(自己的或外部的)、一些编码/解码代码或只是我正在工作的上下文中的一些有用的转换函数。

我考虑的选项是:

1) 辅助类/结构中的静态函数。

2) 非成员函数。

3) 静态非成员函数。

在某些情况下,可能需要在“实用程序”中初始化或保持状态,所以我选择选项 1 以避免“全局”状态。但是,如果没有需要保留的状态,我应该选择 2 还是 3?选项2和3之间的实际区别是什么?

有什么重要的考虑因素,有没有首选的方法来解决这个问题?谢谢!

0 投票
1 回答
547 浏览

c# - 通过反射从 C# 访问 C++ 非成员函数

我需要获得一些关于 C++ 程序的运行时信息,这有点困难,因为 C++ 没有提供一些复杂的反射机制。现在,我的方法是使用 /clr 编译 C++ 代码并反映 C# 生成的程序集(仅仅是因为我更喜欢该语言而不是 C++)。

虽然这一切或多或少都很好,但我现在陷入了需要通过调用其 main 方法来实际运行程序的地步。考虑到我已经走了多远,这有点令人沮丧......

这是有问题的 C++ 程序:

没什么好看的,真的……

这是用于检查生成的程序集的 C# 方法:

现在,虽然 hello Type-array 包含 HelloWorld 类(或者至少我假设它是那个类),但 main var 包含三种类型,所有这些类型都处理 doMAIN(即与我的 sc_main 方法无关)米找)。我认为它与它不是公共的有关,但是将其声明为 HelloWorld 类的静态公共成员函数也不起作用,因为该函数预计是要找到的非成员函数。还是我只是忽略了一些非常愚蠢的事情?

0 投票
3 回答
753 浏览

c++ - 朋友功能,cpp

我们在学校有一个任务是实现一个重载所有算术运算符的 Matrix 类。我所做的是(例如)将 += 定义为成员函数,然后将 + 定义为使用 += 函数的非成员函数(都在同一个文件中,但 + 在类之外)。学校工作人员做了类似的事情,只是他们将“+”声明为友元函数(并且还使用了 += 的实现)。

由于这两种实现都可以完美运行,我试图了解朋友函数给我的非成员函数没有什么?我什么时候应该更喜欢彼此?

谢谢!尤塔姆

0 投票
3 回答
845 浏览

c++ - 非成员函数可以声明多次,成员函数只能声明一次?

非成员函数可以多次声明,而成员函数只能声明一次?这是正确的吗 ?我的例子似乎是肯定的。

但为什么 ?

0 投票
1 回答
43270 浏览

c++ - 在非成员函数中无效使用“this”

我正在上课,并开始在同一个 .cpp 文件中编写所有内容。然而,过了一会儿,我看到这个类越来越大,所以我决定把它分成一个 .h 和一个 .cpp 文件。

gaussian.h 文件:

gaussian.cpp 文件:

但是,我无法编译它。我尝试运行:

但我得到:

为什么我不能用这个??我在 fromPrecisionMean 函数中使用它并编译。是因为该函数返回高斯吗?任何额外的解释都将不胜感激,我正在努力学习!谢谢!

0 投票
5 回答
13263 浏览

python - Python中的非成员与成员函数

我对 Python 比较陌生,并且努力使语言的特性与我从 C++ 和 Java 背景中养成的习惯相协调。

我遇到的最新问题与封装有关,特别是 Meyer 的“ Effective C++ ”的第 23 条最好地总结了一个想法:

首选非成员非朋友函数而不是成员函数

暂时忽略缺乏friend机制,非成员函数是否也被认为比 Python 中的成员函数更可取

一个强制性的,愚蠢的例子:

给定v = Vector(10, 20),我们现在可以调用v.scale(2)scale(v, 2)将向量的大小加倍。

考虑到我们在这种情况下使用属性这一事实,这两个选项中的哪一个(如果有的话)更好,为什么?

0 投票
3 回答
7366 浏览

c++ - 类 VERSUS 命名空间,还是类 AND 命名空间?

类和命名空间?

这个问题是关于我看到自己越来越多地使用的一种模式:同时拥有相关概念的类和命名空间。我认为这主要是由 C++ 语言工件推动的,但并非完全如此。

我想最重要的问题是:这是个好主意吗?同时拥有相关概念的类和命名空间?

低级问题:

做这个的最好方式是什么?

嵌套在命名空间中的类?:

还是分开,对等,类和命名空间?:

我必须承认我倾向于将类嵌套在命名空间中。即使它导致丑陋的名字。但即使我这样做,我应该使用什么命名约定:

以下内容太长,导致名称非常难看 Foo_Namespace::Foo_Class

不必在名称中使用任何后缀或指示符:

但是后来我发现自己不确定,当我查看 Foo::bar() 时,它是命名空间 ::Foo 中的自由函数 bar,即 ::Foo::bar(),还是命名空间中类 Foo 中的成员函数::Foo::Foo::bar()。

像 ::Foo::Foo::bar 这样的名字仍然不是,嗯,很好。

目前我正在做

不必在名称中使用任何后缀或指示符:

主要是因为我通常先创建类,然后才意识到命名空间会很好。

我想知道我是否应该恢复多年来未使用的命名约定:_c 用于类,_ns 用于命名空间:

细节:

我不会重复我上面所说的,但我会补充一点。

除了类之外,我知道使用命名空间的最实际原因是您可以在命名空间中对自由函数进行前向声明,但不允许对类的某些方法进行前向声明。即对于一个类,您必须全部或全部声明它。而对于一般的自由函数,特别是命名空间中的自由函数,您可以将其声明为零碎的。部件可以在不同的头文件中声明。您可以只为一个或两个函数使用前向声明,而不是为一个庞大的类#include 一个庞大的仅标头库。等等。

(例如,请参阅http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Forward_Declarations,尽管 Google 完全反对前向声明而不是包含标题。)

另一个原因是命名空间允许类本身保持较小。

类的最大优点是类可以传递给模板,而命名空间不能。

我更喜欢将类嵌套在命名空间 Foo_ns/Foo_ns::Foo_c 中,而不是将它们作为对等的 Foo_ns/Foo_c,因为通常一个类需要辅助类,例如 Foo_ns/Foo_ns::Foo_c/Foo_ns::Foo_Helper_c。如果类和命名空间是对等的,那么拥有 Foo_ns/Foo_c 而拥有 Foo_ns::Foo_Helper_c 似乎很奇怪。

我喜欢命名空间,因为我同意 Andrei Alexandresciu: http: //laser.inf.ethz.ch/2012/slides/Alexandrescu/1-C++%20course%20parts%201%20and%202.pdf

创建自由函数比创建类中的方法更好。

但有时只需要使用类——例如用于模板。

命名约定明智

我过去使用过 Foo_ns / Foo_ns::Foo_c

我现在正在使用 Foo_ns / Foo_ns::Foo

(顺便说一句,我倾向于使用 Class_Names_With_Underscores_and_Initial_Caps,而不是 CamelCase。)

如果有意义,我可能会省略命名空间上的 _ns 后缀 - 例如,命名空间和类不需要具有相同的名称。

我不喜欢让他们有相同的名字。考虑命名空间 foo 中类 Foo 的构造函数:

::Foo::Foo::Foo() 与 ::Foo_ns::Foo::Foo()

后者也好不了多少,但也少了一些混乱。

我认为我通常自己创建类,而不将其嵌套在命名空间中。事实上,在我意识到嵌套在命名空间中的类会更好之前,我可能会添加一些静态方法。到那个阶段,重构可能会很痛苦,有时我最终会创建转发函数,从类静态方法转发到命名空间中的自由函数,反之亦然。这让我很遗憾机器人从第 1 步开始就跳到带有命名空间的类。

结论

我当前的 BKM 是 Foo_ns / Foo_ns::Foo,即

我会很感激任何建议,任何改进。

还是我只是因为这样做而崩溃?

0 投票
2 回答
8611 浏览

c++ - 将对象与左侧的常数相乘

我有一个Matrix类,它具有*用于标量和矩阵乘法的重载运算符。

我可以将矩阵对象与右侧的标量相乘,没有任何问题:

但是,我如何以同样的方式从左侧乘以它?

在算术中,在进行乘法运算时,将常量写在左侧是一种常见的表示法。我想遵守这条规则以使我的代码更具可读性。

是否可以在 C++ 中实现这一点?
如果可能,如何修改代码中的类方法?