访问has-a关系的访问说明符

Access specifier for Has-A relationship

本文关键字:访问 说明符 关系 has-a      更新时间:2023-10-16

是否可以使成员变量/函数具有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,所有非静态数据成员都必须具有相同的访问权限。...

如果各个类中的所有非静态数据成员都具有相同的访问说明符,则它仍然可以工作。如果是一个很好的解决方案,可以决定...