在嵌套的私有类中使用外部类中的C ++公共变量

时间:2013-12-21 02:36:13

标签: c++ qt class

我已经交了一些使用嵌套类的代码:

class outer : public YetAnotherObject
{
   public:
      outer();
      ~outer();

      std::string*  z;

   private:
      static outer* s_pInstance;  

      class inner : public QThread
      {
         public:
            inner() : QThread()  {}
            ~inner()  {}

         protected:
            void run()
            {
               z = "Hello, world";
               while (1)  { ... whatever ... }
            }
      }innerObj;   // <-- note edit is here
};

outer* outer::s_pInstance = 0;

outer* outer::instance(QObject* par)
{
   if (s_pInstance == 0)
   {
      s_pInstance = new outer(par);
   }

   return s_pInstance;
}

z在其他位置设置为指向std::string

在调用z时,我收到编译错误或运行时崩溃,试图写入inner::start()

这样做的正确方法是什么?让inner继承自outter?公共还是私人?


注意:我在转录中遗漏了一个单词 - 内部对象的一个​​实例是在声明结束时创建的,请参阅代码中的注释指示符。

另请注意,我选择使用指针,而不是使用引用,因此o->z = "";。我记不起任何通过自我引用而不是自我指针的方法。

扩展问题,请问如何将“this”传递给innerObj?

2 个答案:

答案 0 :(得分:1)

向内部类添加指针或对外部类的引用。

class inner : public QThread
  {
     public:
        inner(outer *o) : QThread(), o(o)  { }
        ~inner()  {}

     protected:
        void run()
        {
           o->z = "Hello, world";
           while (1)  { ... whatever ... }
        }

     private:
        outer *o;
  };

虽然你不能将文字(“Hello,world”)分配给指向std :: string的指针。

修改

根据需要更改了上面代码中对指针的引用,但您始终可以使用*this进行自引用。

如果你想实例化内部,你可以这样做:

class outer : public YetAnotherObject
{
   public:
      outer() : innerObj(this) { ... }
      ~outer();

      std::string*  z;

   private:
      static outer* s_pInstance;  

      class inner : public QThread
      {
          ...
      }innerObj;
};

答案 1 :(得分:1)

您的代码中存在两个问题:

1)你不应该使用std :: string指针,因为它实际上不应该像那样使用。

2)C ++中的嵌套类独立于其外部类,即使它嵌套在其中。正如您所看到的,它与嵌套时的情况相同,例如与Java不同。嵌套类中没有隐式实例,等等。

为了访问外部类中的字符串或任何变量,您需要有一个指向outter类的引用或指针,例如以下列方式:

class outer : public YetAnotherObject
{
   public:
      outer();
      ~outer();

      std::string  z; // First modification

   private:
      static outer* s_pInstance;  

      class inner : public QThread
      {
         public:
            inner(outer& o) : QThread(),  outerRef(o)  {} // Second modification
            ~inner()  {}

        outer& outerRef; // Third modification

         protected:
            void run()
            {
               z = "Hello, world";
               while (1)  { ... whatever ... }
            }
      };
};

outer* outer::s_pInstance = 0;

outer* outer::instance(QObject* par)
{
   if (s_pInstance == 0)
   {
      s_pInstance = new outer(par);
   }

   return s_pInstance;
}