【问题标题】:Access the protected variable from a nested class to the enclosing class从嵌套类访问受保护的变量到封闭类
【发布时间】:2021-06-10 02:40:45
【问题描述】:
class A  
{  
public:  
   class B  
   {  
      public:  
          int changevar (int b)  
          {  
            a = b; // 5 should go in "a"   
          }  
          int get()  
          {  
            return a;     
          }     
      protected:  
          int a = 0; // value initialized here  
   };

   private:
        int usechangedvar(B& hello);
};

int A::usechangedvar(B& hello)
{
    int final = hello.get(); // 5 should go in "final"    
    return final;
}

int main()
{
    A::B hi;
    hi.changevar(5);
    
    A obj;
    obj.usechangedvar(hi);
}

这段代码不会编译,因为它会说我正在尝试访问私有方法。 无论如何,我不确定这样做的正确方法是什么,但最后我想要的是: 在 B 类下有一个受保护的变量,其值由名为“changevar”的公共方法更改。值更改后,我需要将该值存储在名为“usechangedvar”的私有方法内的变量“final”中。

注意:我不想将变量“a”从受保护的内容更改为其他内容。

编辑:我愿意接受 B 类不是嵌套类的建议。我可以把它放在外面意味着 A 和 B 不在彼此之内

已编辑:

#include <stdio.h>
#include <iostream>
#include <stdint.h>



class A
{
   public:
   class B
   {
      public:
          int changevar (int b) ------------- This method is called by application code(user) and whatever value user gives here should be the changed value
          {
            a = b; // 5 should go in "a"
            
          }
        //   int get()
        //   {
        //     return a;   
        //   }   
        protected:
            int a = 0; // value initialized here. This could be anything private/protected
   };
   
   class C : public class B
   {
       
   };

   private:
        int usechangedvar();
};

int A::usechangedvar()
{
    // 5 should come here which was inputted by user.
}

int main()
{
    //1) I instantiate class C by doing
    A::C objC;
    objC.changevar(5);
    // Whole purpose is to take 5 from user and then use it eventually in "usechangedvar" method.
}

【问题讨论】:

  • 您不能从main() 调用方法usechangedvar(),因为它是私有的。这与B 类的任何细节无关,无论其成员是否受保护。因此,要么使usechangedvar() 可访问,要么不要在A 类之外使用它。
  • C++ 中AA::B 之间没有特殊关系(您可能来自Java,但情况并非如此)。如果这些课程不是彼此“内部”,而只是免费的AB,你会怎么做?这么想。你现在有点不清楚你想要什么。您通过引用正确访问了B...但是final(顺便想一个不同的名称)是在方法执行期间创建的,然后被丢弃。它的寿命很短。您需要更好地表达您想要做的事情,这样我们才能帮助您做到。
  • @Aconcagua 不会改变任何事情
  • @Slava 你是说因为方法“usechangedvar”是私有的,所以我不能将B类的引用作为该方法的参数? --usechangedvar(B& hello) 为了解决这个问题,我必须把这个方法公开?
  • @Slava 啊,确实,错过了usechangedvar 甚至没有使用受保护的成员......

标签: c++ object-oriented-analysis


【解决方案1】:

这是您的问题,已消除不相关的细节:

class A  
{  
   private:
        int usechangedvar(int hello) { return hello; }
};

int main()
{
    A obj;
    obj.usechangedvar(5); //compile error, usechangedvar is private
}

您的代码中的问题与 B 类完全无关,正如您在此处看到的那样 - 您不能从 main() 调用 A::usechangedvar(),因为它是类 A 的私有方法。

如果您只需要检查您的方法usechangedvar() 是否有效,您可以将公共方法添加到A,例如test(),从中调用usechangedvar() 并可能打印结果。然后你可以从main() 拨打obj.test() 看看它是否有效。如果需要,您可能希望在测试完成后删除该方法 test()

【讨论】:

  • 那么在这种情况下我该怎么办?您也可以将 A 和 B 视为 2 个单独的类,然后告诉我解决方案。我唯一不可协商的事情是,我无法将 usechangedvar 更改为 public,但我可以将其保持为私有/受保护。我无法将变量“a”更改为 public/private,而只是保持它受到保护
  • 呃。同样,您的问题与 B 类无关,您可以将它们分开,可以将它们嵌套,可以将整个 B 类公开,当前代码中的问题在 A 类和 main 中。解决方案 - 要么不从 main() 调用 A 类的私有方法,要么将该方法设为公共,或者主要朋友。不清楚你为什么尝试在 A 类之外调用私有方法,所以我不能说应该使用什么方法。
  • 在A类里面,我定义“朋友类主”你是说这样的吗?
  • main() 不是类,而是函数。无论如何,这会很奇怪,而且不太可能是正确的解决方案。但是我不能再次提出建议,因为我不知道您为什么尝试使用来自 main() 的私有方法
  • 所以它不是我所拥有的“main()”,在 hpp 文件中我定义了私有方法。在 cpp 文件中,我正在定义方法。在该方法中,我必须使用那个“最终”变量。我的实际代码中没有“主要”。您可以考虑调用该私有方法的其他函数(A 的一部分)。
猜你喜欢
  • 1970-01-01
  • 2015-07-16
  • 2016-03-11
  • 1970-01-01
  • 2017-01-12
  • 2011-09-17
  • 1970-01-01
  • 2014-05-14
  • 1970-01-01
相关资源
最近更新 更多