问题标签 [friend-function]

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 回答
671 浏览

c++ - 有没有办法在类内部重载提取运算符而不是类的朋友?

我正在尝试重载 << 运算符,以便当我在 std::cout 中使用我的类对象时,它会打印出应该打印的数据成员。我知道我必须在一个类内部定义一个友元函数签名,然后在类外部定义两个友元函数来完成这项工作,但我想交出这个类,并且不希望用户做任何事情,我想让班级照顾好一切。我怎样才能在 C++ 中实现这样的事情?

先感谢您

0 投票
5 回答
906 浏览

c++ - C++ 中的友元函数

我对 C++ 中的友元函数有疑问。Friend 函数不是 claas 的成员函数,可以直接从 main 调用。那么,如果我们将函数friend保留privatepublic. class我通常注意到这些friend功能总是在公共部分。在什么情况下我们应该将friend函数保持在private.

0 投票
2 回答
147 浏览

c++ - 对重载的运算符参数进行隐式转换时出现编译器错误

从书中做一些练习我遇到了一个疑问。我已经将一些运算符重载定义为类 ( Stonewt ) 的友元函数。问题来自这样的原型:

如果我依靠构造函数进行隐式转换并让编译器完成工作,如下所示(test1 和 test2 是类对象):

我收到如下错误消息:

无法将“std::basic_ostream”左值绑定到“std::basic_ostream&&”

初始化 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits; _Tp = Stonewt]'

OTOH,如果我执行以下操作,我不会收到任何错误:

这就像如果编译器得到一个 Stonewt 对象,它可以转换为 Stonewt& (这是函数所期望的)。但如果它得到其他东西,它就无法迈出步伐,直到到达 Stonewt&。(同样的事情发生在其他运算符重载(如 operator*)的其他实例中,如果我放一个 double 并期望编译器通过构造函数将其转换为 Stonewt,然后再转换为 Stonewt&,它不起作用。我必须放一个 Stonewt目的)。

这是正确的行为吗?有什么帮助吗?

我会放整个程序以防万一你需要它:

类定义:

方法+友元函数+转换函数实现:

客户(未完成):

0 投票
3 回答
4577 浏览

c++ - 无法在 pthread_create 函数中将 '*void(MyClass::*)(void*) 转换为 void*(*)(void*)

我正在尝试使用“CameraManager”类创建一个新线程,但出现以下错误:

无法在 pthread_create 函数中将 '*void(CameraManager:: * )(void*) 转换为 void*( * )(void*)

我在 cameramanager.h 文件中定义:

并在 cameramanager.cpp

我不想将 dequeueLoop 声明为静态函数我也尝试通过以下方式将 dequeueLoop 声明为类友函数,但是它在类变量“highSpeedCamera”和“dequeuing”上没有作用域,编译器也告诉我没有在这个范围内声明“dequeueLoop”

为了使 dequeueLoop 成为我所做的朋友功能:

相机管理器.h

相机管理器.cpp

我在哪里做错了?

0 投票
4 回答
44625 浏览

c++ - c++错误C2662无法将'this'指针从'const Type'转换为'Type &'

我正在尝试重载 c++ operator== 但我遇到了一些错误...

错误 C2662:“CombatEvent::getType”:无法将“this”指针从“const CombatEvent”转换为“CombatEvent &”

这个错误在这一行

见下面的代码:

有人可以帮忙吗?

0 投票
1 回答
158 浏览

c++ - 在完全专用的模板函数中实例化一个类的对象

我不知道为什么我不能在一个完全专门的函数中实例化 B 类的对象,尽管在 B 类中声明该函数为朋友。请帮助。我不知道这是否是一个愚蠢的怀疑但我是第一次学习 C++ 模板。我收到以下错误:

0 投票
3 回答
6887 浏览

c++ - 当函数应该改变对象的状态时,是否选择成员函数或友元函数?

在 Bjarne Stroustrup 所著的 The C++ Programming Language 一书中,作者介绍了一个必须实现函数 inv() 的类 Matrix。在第 11.5.1 节中,他谈到了这样做的两种可能性。一种是创建成员函数,另一种是创建友元函数 inv()。然后在第 11.5.2 节的末尾,他谈到选择是使用朋友还是成员函数,他说:

如果 inv() 确实反转了 Matrix m 本身,而不是返回一个与 m 倒数的新 Matrix,它应该是一个成员。

为什么会这样?友元函数不能改变矩阵的状态并返回对该矩阵的引用吗?是不是因为我们调用函数时可能会传递一个临时矩阵?...

0 投票
4 回答
217 浏览

c++ - 是否有必要在朋友功能中使用访问器?

这是课程

这是ostream函数

}

这是 getname 和 getID 方法

我的问题是为什么我们需要使用 getID 和 getname 函数。我们不能通过写“this->name”来访问名称吗?感谢您的回答。

0 投票
3 回答
563 浏览

c++ - 模板类的重载运算符<<

我在为模板类重载 operator<< 时遇到问题。我正在使用 Visual Studio 2010,这是我的代码。

主要我只有

whereInteger只是int我需要的一些特殊功能的包装。

但是,当我编译上面的代码时,我得到了错误 C2679,它说binary '<<' : no operator found which takes a right-hand operand of type 'Polyff::FiniteField<T,n>' (or there is no acceptable conversion)

我还尝试删除朋友声明中的参数,因此代码变为:

但这会产生另一个错误:C2785:'std::ostream &Polyff::operator <<(std::ostream &,const Polyff::FiniteField<T,n> &)' and '<Unknown>' have different return types

所以我想知道我应该如何更改代码以便编译,为什么?谢谢!

------------------------- 编辑于 2012.12.31 -------------------- --------

代码现在用 g++ 编译。是github存储库。

0 投票
1 回答
150 浏览

c++ - 普通类中的朋友模板函数

我想我需要一个普通类中的模板友元函数。该函数将在共享内存中进行一些复杂的分配,并在硬件和操作系统中进行一些其他操作。但是我已经排除了所有这些,以表明问题与 -template- 和/或 -friend- 方面有关,而不是更邪恶的东西。主要部分是我需要类的实例及其成员数据都分配有一个分配器,我可以将其作为通用参数传递。

我认为这应该是正确的解决方案。只有 alloc_Foo 应该调用构造函数,只有工厂方法应该调用 alloc_Foo。Foo 的实例及其单独分配的内部部分是在它们应该在的共享内存中创建的,所有复杂的分配内容都隐藏在 alloc_Foo 朋友模板中。这部分我可以正常工作。我什至不介意在同一个文件中实现 alloc_Foo,因为它简短而简单。但是调用 alloc_Foo 的工厂又大又复杂,并且会弄乱一个包含数十个包含和数百行代码的原本干净而简单的类。

我试图在最后包含实现,这样我就可以将每个工厂放在一个单独的文件中。

然后在 .tpp 文件中我放置了实际代码,但我似乎无法包含任何内容,比如 bar.h。#include 规则似乎分崩离析。恐怕与我的模板分配器朋友有关。我肯定不想失去它,因为它解决了我的许多其他问题。

通常我不会对范围交易如此执着,但这对我来说是一个不寻常的组合。也许我在考虑整个交易。我认为 alloc_Foo 必须是一个朋友,所以它可以看到我隐藏的构造函数。我认为它也应该是私有的,只有工厂才能使用它。我认为分配器和工厂实际上都不是函数的一部分。他们没有或不需要“这个”。也许它们应该是静态的。我认为它必须是一个模板,因为我需要在许多内部部分和每个实例的实际对象本身上使用一个特殊的分配器。它应该是静态的。

有人可以帮忙吗?

谢谢。