在 C++ 中使用友元函数

2023-12-27

刚刚阅读了有关友元函数的内容,我正在尝试使用 B 类中的友元函数“Print”访问 A 类中的私有变量“number”。我正在使用 Visual Studio。我的代码的编译给了我很多不同的错误,例如:

C2011:'A':'class'类型重新定义
C2653: 'B' : 不是类或命名空间名称

请对我有耐心,并展示实现我的目标的正确方法。

这是我的文件 啊:

class A
{
public:
    A(int a);
    friend void B::Print(A &obj);
private:
    int number;
};

A.cpp:

#include "A.h"

A::A(int a)
{
    number=a;
}

B.h:

#include <iostream>
using namespace std;
#include "A.h"
class B
{
public:
    B(void);
    void Print(A &obj);
};

B.cpp:

#include "B.h"

B::B(void){}

void B::Print(A &obj)
{
    cout<<obj.number<<endl;
}

主要.cpp:

#include <iostream>
#include <conio.h>
#include "B.h"
#include "A.h"

void main()
{
    A a_object(10);
    B b_object;
    b_object.Print(A &obj);
    _getch();
}

...其次你可能需要一个类的前向声明B in the A.h引用的头文件B作为一个朋友:

#ifndef _A_H_
#define _A_H_
class B;

class A
{
     friend class B;
};
#endif

UPDATE
我目前不太确定是否可以将成员函数声明为友元,我会看看。

无法创建成员函数friend声明,您可以将全局函数或整个类声明为友元,另请参阅:C++ 参考,友谊和继承 http://www.cplusplus.com/doc/tutorial/inheritance/.

一般来说,这不是一个好的设计理念friend根本没有,因为它将课程紧密地结合在一起。更好的解决方案是耦合接口(无论如何都不需要公开可见)。
在极少数情况下,这可能是一个很好的设计决策,但这几乎总是适用于内部细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中使用友元函数 的相关文章

  • 未提供参数时如何指定 C# System.Commandline 行为?

    在我的控制台应用程序中 当未提供控制台参数时 将执行我指定列表 在本例中为参数 3 的任何处理程序 调用该处理程序时 布尔参数设置为 false 但对我来说 根本不调用它更有意义 如何防止这种情况发生并显示帮助文本 using System
  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • ClickOnce 应用程序错误:部署和应用程序没有匹配的安全区域

    我在 IE 中使用 FireFox 和 Chrome 的 ClickOnce 应用程序时遇到问题 它工作正常 异常的详细信息是 PLATFORM VERSION INFO Windows 6 1 7600 0 Win32NT Common
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 为什么极端下派生类(多重虚拟继承)的大小包括超类成员大小的两倍?

    include
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • C++ 函数重载类似转换

    我收到一个错误 指出两个重载具有相似的转换 我尝试了太多的事情 但没有任何帮助 这是那段代码 CString GetInput int numberOfInput BOOL clearBuffer FALSE UINT timeout IN
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • EntityFramework t4 模板 - XML 文档

    我的 EDMX 文件存在以下问题 我在其中编写了一些属性和实体的文档 但 EF 5 的 t4 模板不会生成这些值 我想要的结果应该是 public class Person
  • Android 列表视图中的 Google 地图加载问题

    我试图在我的列表视图上显示地图视图 地图无法在列表视图中加载 如果我触摸地图视图 地图就会加载 如果我滚动列表视图 地图视图将进入卸载初始阶段 给出了我的列表视图适配器和屏幕截图 公共类 OfferListAdapter 扩展 BaseAd
  • 在 python 2.7 ctypes 中构建 UCS4 字符串缓冲区

    在尝试重新创建getenvironment C 函数 winapi c 直接链接 https github com python cpython blob 202fda55c2dffe27125703225e5af92254602dc6 M
  • StackTrace 构造函数和获取方法名称对性能的影响

    我的日志库中有这段代码 var stackTrace new StackTrace string operationName stackTrace GetFrame 1 GetMethod Name 根据我使用 PerfView 工具进行的
  • PHP 警告:113 字节的 POST 内容长度超出了未知中 -1988100096 字节的限制

    用户在我的网站上上传图像时遇到很多问题 他们最多可以上传 6 张图片 最初我必须将 php ini 中的值更改为 upload max filesize 2000M post max size 2000M max execution tim
  • 如何使用最小起订量来测试 MongoDB 服务层?

    我的应用程序和 mongo 数据库之间有一个服务层 我正在尝试使用最小起订量构建单元测试 我对最小起订量很陌生 所以我从我认为是一个微不足道的测试开始 要测试的代码 public List
  • Angular - 如何导入 googleapis 库?

    我正在尝试将 Google Drive API 合并到我的一个项目中 Node js快速入门指南 https developers google com drive api v3 quickstart nodejs要求我导入文件读取和 go
  • 是否存在无法避免 lambda 中的尾随返回类型语法的情况?

    关于之前的问题 是否可以通过 lambda 引用返回 T 类型的对象 而不使用尾随返回类型语法 q 40977730 我想知道是否还有其他重要的案例或例子尾随返回类型语法 当使用 lambda 时 可以not应避免 在 C 14 中 一个有
  • 在 MATLAB 中将 repmat 替换为 bsxfun

    在下面的函数中 我想进行一些更改以使其更快 它本身很快 但我必须在 for 循环中多次使用它 所以需要很长时间 我想如果我用 bsxfun 替换 repmat 会使其更快 但我不确定 我该如何进行这些替换 function out lagc
  • 当 onCreate 中完成 Activity 时,我的 Fragment 的 onCreateView 在 onCreate 之前如何被调用?

    这很奇怪 我有一个简单的应用程序 登录后会显示活动中的片段 该应用程序还有一个不活动的 超时 在此时间后它会完成活动并显示登录屏幕 如果应用程序在超时发生时处于后台 那么当下一次超时时onCreate or onStart事件发生在它完成的
  • 在哪里可以找到 FCM Firebase 注册 ID(在 PHP 中,对于 Ionic 框架)?

    我们已经使用 Ionic 框架构建了一个应用程序 我们是 Ionic 等的初学者 并将设备注册到我们的 Firebase 帐户 以便我们可以发送推送消息 我现在找到了一个通过 cURL 连接到 fcm 的 PHP 片段 我可以设置消息和标题
  • 实现阶乘函数时出现“所有控制路径递归”错误

    对于课堂 我有一个作业 编写一个 C 程序 输出您可以选择的不同方式的数量k一组中的对象n对象 两者n and k应为正整数 该数字由以下公式给出 C n k n k n k 您的程序应该使用两个返回值的函数 第一个应该叫factorial
  • 为什么来自类的java字节码出现新静态内部类的代码出现jvm指令ACONST_NULL

    我尝试新建一个内部静态类 但我发现字节码出现了jvm指令ACONST NULL bwteen NEW DUP and INVOKE SPECIAL 但我知道一门新课是 NEW DUP 调用 特殊 package com hoho api a
  • 自定义 Jackson 对象映射器

    我有一个用例 需要维护两组 JSON 输出 一组具有漂亮的 JSON 属性名称 另一组没有 因此 我决定自定义 ObjectMapper 以便它忽略字段上的 JsonProperty pretty name 注释并使用字段属性名称 在这种情
  • SQL内联if语句类型问题

    我想做一个 MS SQL 查询 返回如下内容 Col1 Col2 Col3 AAA 18 92 18 92 BBB 20 00 40 00 AAA 30 84 30 84 BBB 06 00 12 00 AAA 30 84 30 84 AA
  • 在服务器端java类中读取客户端时区

    我有一个客户端程序 它将时间发送到服务器端程序 我正在使用 Callendar 对象将时间值从客户端传递到服务器 我的客户端程序位于斯里兰卡 服务器位于英国 当我在客户端发送时间 例如 2011 11 21T12 43 41 352 05
  • 如何读取UTF-8的InputStream?

    欢迎大家 我正在开发一个 Java 应用程序 它从互联网调用 PHP 它给我一个 XML 响应 响应中包含这个词 Pr ximo 但是当我解析 XML 的节点并将响应获取到字符串变量中时 我收到这样的词 Pr ximo 我确信问题是我在 J
  • 如何绑定到“MvxLinearLayout”的“ItemClick”?

    我有一个ScrollView最初包裹着两个MvxListView控制 Having ListView控制在一个ScrollView不过 Android 不支持 这是有道理的 因为它们都尝试填充父高度并提供自己的滚动逻辑 我想要的是两个不可滚
  • 使用核心数据实现枚举的最佳方法

    将核心数据实体绑定到枚举值以便我能够为实体分配类型属性的最佳方法是什么 换句话说 我有一个名为Item与itemType我想要绑定到枚举的属性 最好的方法是什么 如果您想将值限制为枚举 则必须创建自定义访问器 因此 首先您需要声明一个枚举
  • 在 C++ 中使用友元函数

    刚刚阅读了有关友元函数的内容 我正在尝试使用 B 类中的友元函数 Print 访问 A 类中的私有变量 number 我正在使用 Visual Studio 我的代码的编译给了我很多不同的错误 例如 C2011 A class 类型重新定义