c++ - 如何使用`this`访问类数组中的成员变量

Posted

技术标签:

【中文标题】c++ - 如何使用`this`访问类数组中的成员变量【英文标题】:c++ - How to use `this` to access member variables in an array of classes 【发布时间】: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>? 此外,如果您的代码不是玩具程序,静态计数很少会按照您希望的方式工作。您在程序运行期间发生了临时、复制等情况,并且该“计数”成员可能具有您没想到的值。 必须调查一下。指针?而且,不,它的目的是用于商业用途。 【参考方案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 指针,您实际上不需要使用)。

【讨论】:

你说的很对。昨晚我越想这件事,我的脑袋就越错。我怀疑今天早上我能想出一个更好的设计。

以上是关于c++ - 如何使用`this`访问类数组中的成员变量的主要内容,如果未能解决你的问题,请参考以下文章

C++ this详解

如何在构造函数中访问类变量以在不使用 C++ 中的 this 指针的情况下分配它们

关于C++静态成员函数访问非静态成员变量的问题

如何从派生类访问类的成员 - C++

如何从同一个类中的方法访问类数据成员[重复]

C++ this指针