如何与私人嵌套课程成为朋友

时间:2019-07-09 10:43:10

标签: c++ c++17 friend

我认为我可以这样做:

class TestA
{
private:
  class Nested
  {

  };
};

class TestB
{
public:
  friend class TestA;
  friend class TestA::Nested;
};

但是我得到一个错误:

  

错误C2248'TestA :: Nested':无法访问在类中声明的私有类

有没有办法与私人嵌套课程成为朋友?我该怎么办?

当尝试在MSVC 2017(C ++ 17)中编译MSVC 6项目时遇到此错误。我想那回可以。

4 个答案:

答案 0 :(得分:15)

通过相同的方式,您可以访问任何其他私人物品。您还需要友谊:

  Tags:
    - Key: Application
      Value: !Ref 'AWS::StackId'
    - Key: Name
      Value: MNPMGMT-SPMASTER
  NetworkInterfaces:
    - NetworkInterfaceId: !GetAtt 'MgmtNetworkingStack.Outputs.niSplunkMstrIp'
      DeviceIndex: '0'
  BlockDeviceMappings:
    - DeviceName: /dev/sdb
      Ebs:
        Encrypted: 'true'
        VolumeSize: '250'
  UserData: 
    Fn::Base64: |
      #!/bin/bash
      EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
      EC2_REGION=${EC2_AVAIL_ZONE:0:${#EC2_AVAIL_ZONE} - 1}
      ROOT_DISK_ID=$(aws ec2 describe-volumes --filters Name=attachment.instance-id,Values={EC2_INSTANCE_ID} Name=attachment.device,Values=/dev/sda1 --query 'Volumes[*].[VolumeId]' --region=${EC2_REGION} --out \"text\" | cut -f 1)
      aws ec2 create-tags --resources $ROOT_DISK_ID --tags Key=Name,Value=\"Root Volume my-instance\" --region ${EC2_REGION}

答案 1 :(得分:8)

这可以做到:

File.ReadAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "pippo.xml"));

说明:class TestA { friend class TestB; private: class Nested {}; }; class TestB { public: friend class TestA::Nested; }; 本身有责任将其内部结构提供给他人。想象任何TestA都可以侵入性地使用友谊来访问其他类的内部结构(从库等),这将为任意破坏封装打开大门。

答案 2 :(得分:4)

您尝试在private中使用TestA的{​​{1}}嵌套类,然后应将TestB声明为 TestB < / em>在friend中。例如

TestA

答案 3 :(得分:0)

只需注释掉friend class TestA::Nested;行,如下所示:

class TestA
{
private:
  class Nested
  {

  };
};

class TestB
{
public:
  friend class TestA;
  // friend class TestA::Nested;
};

由于TestA::Nested的范围与TestA相似,因此TestA::Nested的方法可以访问TestB的私有/受保护成员。