- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的目标很简单——我想从另一个类的方法访问一个类的 protected 成员。为此,我有以下内容-
A.HPP
#ifndef A_HPP
#define A_HPP
#include "B.hpp"
using namespace std;
class A
{
protected:
int a;
public:
A();
~A(){};
friend void B::geta(A& ao);
};
inline A::A()
{
a = 2;
cout << a;
}
#endif
B.HPP
#ifndef B_HPP
#define B_HPP
using namespace std;
class A;
class B
{
protected:
int b;
public:
B();
~B(){};
void geta(A& ao);
};
inline B::B()
{
b = 1;
cout << b;
}
inline void B::geta(A& ao)
{
b = ao.a;
cout << b;
}
#endif
MAIN.CPP
#include <iostream>
#include "A.hpp"
#include "B.hpp"
int main()
{
A ao;
B bo;
bo.geta(ao);
return 0;
}
当我编译它时,出现以下错误。
我该如何解决这个问题?我在这里看到的大多数答案只是将所有类放在一个文件中,并在适当的位置定义函数来实现这一点,但我需要将它们放在单独的文件中。
最佳答案
您当然可以将 B::geta
的定义移动到包含 A.hpp 的 B.cpp 文件中,并删除 inline
关键字。但这可能会降低编译器优化的可能性。
#include
逻辑只有当编译器看到 A
的前向声明、B
的定义、A
的定义时,你的定义才能编译>,以及 B::geta
的定义,全部按此顺序。所以如果你想在一个文件中定义 A
而在另一个文件中定义 B
,你需要让预处理器在文件之间来回切换.
// NO A_HPP include guard!
#ifdef INCLUDED_FROM_B_HPP
class A
{
protected:
int a;
public:
A();
~A(){};
friend void B::geta(A& ao);
};
inline A::A()
{
a = 2;
cout << a;
}
#else
# include "B.hpp"
#endif
#ifndef B_HPP
#define B_HPP
class A;
class B
{
protected:
int b;
public:
B();
~B(){};
void geta(A& ao);
};
#define INCLUDED_FROM_B_HPP
#include "A.hpp"
#undef INCLUDED_FROM_B_HPP
inline B::B()
{
b = 1;
cout << b;
}
inline void B::geta(A& ao)
{
b = ao.a;
cout << b;
}
#endif
所以现在如果一个文件执行#include "B.hpp"
,预处理器将:
class A;
和B
的定义。INCLUDED_FROM_B_HPP
。INCLUDED_FROM_B_HPP
的定义。B
的内联成员的定义。如果一个文件首先执行#include "A.hpp"
,事情就有点棘手了:
INCLUDED_FROM_B_HPP
没有设置,直接进入B.hpp。class A;
和B
的定义。INCLUDED_FROM_B_HPP
。#include "A.hpp"
时,预处理器会递归回到A.hpp。但是这次由于定义了INCLUDED_FROM_B_HPP
,所以输出的是A.hpp的代码内容。INCLUDED_FROM_B_HPP
的定义。B
的内联成员的定义。 friend 类 B;
与其将一个成员函数 B::geta
指定为 friend,不如通过声明 friend class B;
与类本身成为 friend 。现在A.hpp不需要包含B.hpp,所以不存在循环依赖问题。
从访问权限的角度来看,这并没有减少封装,因为通常任何可以修改 class B
任何部分的程序员也可以修改 B::geta
.但它确实打开了在 B
的其他成员中“意外地”使用 A
的非公共(public)成员的可能性。
#ifndef A_HPP
#define A_HPP
class B;
class A
{
protected:
int a;
public:
A();
~A(){};
class AccessForB {
private:
static int geta(A& aobj) { return aobj.a; }
friend class ::B;
};
};
inline A::A()
{
a = 2;
cout << a;
}
#endif
...
inline void B::geta(A& ao)
{
b = A::AccessForB::geta(ao);
cout << b;
}
这段代码引入了一种新的封装方式:现在class B
只能从成员a
中获取值,不能修改那个值,也不能访问A
的任何其他非公共(public)成员。可以酌情为其他成员添加其他访问器。为了允许修改成员,该类可以提供“set”访问器,或者提供返回引用的访问器。对于非公共(public)函数,该类可以提供仅传递给实际函数的包装函数。
B
的成员而不是 B::geta
仍然有可能利用友元,但现在输入 A::AccessForB: :
不能真正认为是意外。
关于c++ - 两个单独文件中另一个类的类方法 friend ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52324788/
我想知道将来对我来说最简单的方法是什么,可以使查询既有效又不那么复杂。 我应该像这样保存双向关系吗 from_id=1, to_id=2from_id=2, to_id=1 或者只创建一个唯一的行 f
假设您有一个拥有十亿用户的社交网络。在每个用户的页面上,您想要显示该用户的 friend 数、 friend 的 friend 等等,最多五度。友谊是相互的。计数不需要立即更新,但它们应该是精确的。
public void notMyFriend(Student student1) { System.out.println("Friends who are not my frien
我有如下3个表格 用户 - id integer primary_key - user_name friend - id autoincrement primary_key - user1 integ
如何从 Friends 表中获取 friend 列表以及我 friend 的 friend 数(不包括我的 friend 数) friend 表"tbl_users_friends 字段 1:id字段
我的 MySQL 表结构是这样的。 USER int id varchar username FRIEND_LIST int user_id int friend_id 对于每个 friend 关系,
假设 a,b,c 和 b,d,e 和 c,f,g 和 a,e,g,h 是 friend 。所以 获取共同好友 b/w a&b: MATCH (me:User {username:'a'}) -[r:F
我正在开发“可能的 friend ”功能。我需要显示所有不是我 friend 的 friend 的 friend ,也不要发送我或没有我的待处理请求 FRIENDSHIPS user_id frien
如果两个用户是 friend ,我在“ friend ”表中有一个条目,如下所示: table: friends ------------------------ uid1
我有一个 friend 表,用于跟踪数据库中的关系 - 我将一个查询与子查询放在一起,该子查询从 friend 的 friend 那里获取个人资料信息 我的 friend 表如下所示 - id 双向出
我想结交 friend 的 friend 的 friend 。我得到了结果,但我不确定我的查询是否正确。我正在使用嵌套选择。 我的问题是: 查询是否正确? 我如何使用 join 执行此查询? 这是我的
假设我有一个包含 friend 属性的用户对象。这个 friends 属性是其他用户对象的数组,因此是你的 friend 。找到你 friend 的 friend 但不是你 friend 的最快算法是
我想结交我的 friend 以及 friend 的 friend ,但仅限于二级 friend 我的表结构是这样的 user_id friend_user_id 1 2 1
为了了解使用 Neo4J 建立 friend 关系的优势,我在 MySQL 数据库上创建了一张用于 Persons 的表(“Persons”,20900 个数据集): id | name --
假设我有一个名为“ friend ”的表,对于每个友谊,我添加两个条目。例如,如果用户 1 和 2 是 friend ,我们将有: uid1 uid2 ---------- 1 2 2 1
在我的图形数据库中,我有 Twig 和树叶。分支可以“包含”叶子,分支可以“包含”分支。 如何使用 Gremlin 找到与给定分支直接或间接相关的所有叶子? 我让这个在 Cypher 中工作: STA
我正在尝试使用 iPhone Facebook SDK 获取我 friend 的 friend 列表。我尝试了一种使用 FQL 和 Graph API 的方法,但在这两种情况下我都遇到了错误: "Ca
我有这个 MySQL 表: 假设我以用户 1 的身份登录,正在浏览用户 2 的个人资料。由于我们是共同的 friend (1 是 2 的 friend ,2 是 1 的 friend ),我需要回应“
我想得到我 friend 的 friend 不是我 friend 的 friend 。我有一张这样的 table :用户 friend (idUser,idUserFriend) 我在想这样的事情:
我有这个 Cypher 查询... match (p:Person{userid:8432})-[r:friends_with]->(p1:Person)-[r2:friends_with]->(p2
我是一名优秀的程序员,十分优秀!