访问has-a关系的访问说明符
Access specifier for Has-A relationship
是否可以使成员变量/函数具有private
的访问能力,以及从类中的可访问性与它是?
代码:
class A{
Has-A specifier: //imaginary syntax
int x;
};
class B{
void do_somthing(){
a.x=5; //OK
}
A a;
};
int main(){
A.x=5 // Denied- x is not accessible
}
换句话说,我希望class B
自动为friend
,而不会在与Has-A关系有关的任何类中添加任何代码行。有可能吗?
注意:我知道friendship
将允许其访问其所有私人成员,而不仅仅是x
。如果可以在可变/功能级别上进行friendship
,那将是很棒的。如果没有,全局friendship
也很好。
我已经用Apple Compiler和GNU 语言方言在Xcode中测试了以下设置;必须谨慎使用设置(如果要完全使用)。请参阅答案结尾处的备注。
假设一个标题文件定义A类如下:
// testprivateA.h:
#ifndef memberpublic
#define memberpublic private:
#endif
class A {
memberpublic
int x;
};
#undef memberpublic
...和一个单独的标题定义B类:
// testprivateB.h:
#include "testprivateA.h"
class B {
public:
void test();
A a;
};
在实现成员函数B::test()
的地方,将memberpublic
定义为public:
:
// testprivateB.cpp:
#define memberpublic public:
#include "testprivateB.h"
void B::test()
{
a.x = 5; // OK
}
在使用A
类的任何其他地方,令memberpublic
保持不确定;访问成员变量A.x
然后产生编译器错误:
// anyOtherFile.cpp:
#include "testprivateB.h"
void testfail()
{
A a;
a.x = 5; // Error: 'x' is a private member of 'A'
}
现在,一个人可能会询问此行为是否符合C 标准。这个问题的答案是 - 实际上不是(尽管我花了一段时间才知道原因)。
尽管程序中可能有多个类的定义,但上方设置与一个定义规则相矛盾,因为不同的访问说明符会导致代币的不同序列:
,只要每个定义出现在不同的翻译单元中,每个定义都可能有一个以下定义,以下每个定义:类型,枚举类型,枚举类型,内联函数,具有外部链接内联链接(以来)C 17),类模板,非静态功能模板,类模板的静态数据成员,类模板的成员功能,部分模板专业化,只要以下所有内容都是正确的: - 每个定义都由相同的令牌序列(通常,显示在同一标头文件中)
仍然可以工作,但主要问题是内存布局和访问说明符的连接 - 访问说明器中定义 - cppreference.com:
任何数量的访问说明符都可以按任何顺序出现在类中。成员访问说明符可能会影响类布局:仅保证非静态数据成员的地址按照具有相同访问的会员的声明顺序增加。对于StandardLayoutType,所有非静态数据成员都必须具有相同的访问权限。...
如果各个类中的所有非静态数据成员都具有相同的访问说明符,则它仍然可以工作。如果是一个很好的解决方案,可以决定...
- 函数模板签名中忽略的成员类型def 的访问说明符
- C++ 访问说明符理解
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 访问说明符和性能
- 访问说明符外部的 C++ 类成员
- 在scons中将访问说明符从private更改为public
- 使用Astmatcher获得至少两个相同访问说明符的课程
- 内联访问说明符出现语法问题
- 为什么C 标准专门为具有不同访问说明符的类数据成员的内存布局提供了余地
- 访问has-a关系的访问说明符
- 访问说明符不会更改可访问性级别.这是什么意思
- 关于C++中的访问说明符
- 关于访问说明符的困惑
- 类定义中的宏相关访问说明符是否会导致未定义的行为
- 为什么虚函数无视访问说明符?C++
- 模拟 C 中的访问说明符
- 访问说明符对好友函数是否重要
- 细粒度访问说明符 c++
- 对基于访问说明符的特定重载函数使用声明
- 在C++中,do访问说明符不控制静态成员的可见性