【问题标题】:c++ - How to use `this` to access member variables in an array of classesc++ - 如何使用`this`访问类数组中的成员变量
【发布时间】:2014-02-18 00:30:02
【问题描述】:

给定一个具有各种成员数据值和静态 int 计数器的 C++ 类,我想要一个 clear() 函数,它可以遍历这些类对象数组的所有元素,清除它们的数据成员。

因此,例如,一个看起来像这样并保存芯片版本信息的类(是的,我知道我可能需要更多的 setter 和 getter):

class  __STA_version_t
{  
   public:
      __STA_version_t() { count++; };
      ~__STA_version_t() {};
      void     setVerString( char* x )    { strncpy( verString, x, sizeof(verString)); verString[sizeof(verString)-1] = 0
      void     clearVerString()           { memset( verString, 0x0, sizeof(verString) ); }
      char*    getVerString()             { return verString; }    
      bool     hasVersion()               { return verString[0]; }      
      void     clear()
      { 
         for ( int i = 0; i < count; i++ )
         {
           // what goes here?
         }
      }

   private:
      static int    count;                // how many of these objects exist, need to know for clear().

      char          verString[20];        // station version as a string
      UINT8         major_ver;            // major version identifier (3 bits)
      UINT8         minor_ver;            // minor version identifier (6 bits)
      UINT8         revision;             // revision identifier (4 bits)
      UINT8         chip_ident;           // target chip identifier (3 bits)
}; 

因此在其他地方初始化count

__STA_version_t::count = 0;

现在,创建一个对象数组:

__STA_version_t      versions[10];

首先,检查一下,实例化后 count 应该等于 10,对吧?

clear() 函数中,我想说的是:

this[i]->clearVerString();
this[j]->revision = 0;
// etc.

清除数组中每个元素的每个数据成员。

这可以工作吗?怎么样?

【问题讨论】:

  • 只使用 std::vector 有什么问题<__sta_version_t>?
  • 此外,如果您的代码不是玩具程序,静态计数很少会按照您希望的方式工作。您在程序运行期间发生了临时、复制等情况,并且该“计数”成员可能具有您没想到的值。
  • 必须调查一下。指针?而且,不,它的目的是用于商业用途。

标签: c++ arrays class static


【解决方案1】:

问题是该类无法看到其边界之外并且容器位于该类的边界之外。

您应该使用标准容器。使clear方法清除类中的数据成员。

标准容器具有确定物品数量的方法。

std::vectorstd::liststd::map

【讨论】:

  • 同上我对@Ozraptor 的评论
【解决方案2】:

您正在尝试做的不是非常“面向对象”的 IMO。我认为您在这里尝试实现的类clear() 成员函数应该只清除调用它的实例化对象的数据。您要做的是通过仅在其中任何一个/一个上调用 clear() 来清除类的 所有 实例中的数据?

这里更好的方法是将您的对象存储在std::vector&lt;__STA_version_t&gt; 中,然后在您的类上编写一个静态函数,该函数将向量作为参数(理想情况下),或者可以以某种方式全局访问它,可能称为@ 987654324@。让该函数遍历向量并在向量中的每个对象上调用clear()。然后 clear() 函数将简单地调用 clearVerString() 等自身 - 例如: this-&gt;clearVerString(); this-&gt;revision = 0; 等等(请注意,如果您不想使用 this 指针,您实际上不需要使用)。

【讨论】:

  • 你说的很对。昨晚我越想这件事,我的脑袋就越错。我怀疑今天早上我能想出一个更好的设计。
猜你喜欢
  • 2011-12-21
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2015-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多