【问题标题】:Get class pointer name from within its method?从其方法中获取类指针名称?
【发布时间】:2020-12-11 23:36:19
【问题描述】:

免责声明:我对编程还很陌生,我的术语可能还很陌生。当我说“类指针名称”时,我指的是“myClass A”和“A.Fill(...)”中的“A”。 我不确定如何表述我的问题以使其尽可能清晰,但让我试试吧:

class myClass{
public:
    // stuff
    Fill(string msg)
    {
        // does stuff
        cout << msg + "some extra text"; /*here I want to somehow get the name of the class pointer
                which was used when calling this method, rather than having to manually pass it on as a string.*/
        // more stuff
    }
};

int main()
{
    myClass A;
    myClass B;
    myClass C;
    A.Fill("A");
    B.Fill("B");
    C.Fill("C");
}

这段代码目前正在做我想要的。但是,我想知道是否有可能以某种方式从方法中获取类指针名称,而不必每次都手动传递字符串参数? 我知道在宏中我可以使用 #A #B #C 来准确地做到这一点,但我不确定这将如何应用于我的代码,以及是否可能。

【问题讨论】:

  • 不,您不能从类函数中获取变量名。它们不会被保留以供在运行时使用。

标签: c++ methods


【解决方案1】:

你不想要变量名,也不希望在每次调用对象的方法时都传递它们。

您需要对象名称。你需要给A对象一个名字,然后这个名字可以被它的所有方法使用。

然后,如果你想要方便,而不是将其实例化为ClassA A("A");,你可以有一个宏来完成它,比如

#define ClassA_instance(var) ClassA var(#var)

用途:

ClassA_instance(A);

这样,您可以创建一个与变量同名的类的实例——但这纯粹是为了方便。您很快就会发现,您可以为对象提供比变量名称更好的名称,特别是如果这些对象存储在其他对象内部,其中成员变量名称可能由于例如。 m_ 前缀。然后,您还可以组合对象名称,以便某个对象 A 内的对象 B 将其名称设置为“A.B”或类似名称。将名称与变量的名称联系起来的用途非常有限。

ClassA 当然必须存储它的名字,并且它的构造函数必须接受这个名字。例如:

ClassA {
  std::string m_objectName;
public:
  ClassA(const std::string &name) : m_name(name) {}
  ClassA(const char *name) : m_name(name) {}
  ...
};

您可以将命名方面分解到一个基类中,尽管它的代码太少以至于我看不出这样做的意义——除非您有其他更好的理由来拥有一个通用的基类。

【讨论】:

    【解决方案2】:

    甚至编译器都不知道调用成员函数时使用了什么变量名。但你是对的,你可以使用宏来做你想做的事。

    #define FILL(X) X.Fill(#X)
    
    FILL(A);
    FILL(B);
    FILL(C);
    

    【讨论】:

      【解决方案3】:

      不,没有办法通过类的函数自动获取变量名。

      要做你要求的,它必须被传入。

      Fill(string name, string msg)
      {
          //...
      }
      

      也许您可以想出一个宏,该宏可用于进行函数调用的地方,以简化名称的传递。

      myClass A;
      CALLFUNCTIONANDPASSNAME(A, Fill("A"));
      

      但在我的选择中,这只会增加复杂性而没有什么价值。

      此外,在很多情况下,试图确定变量名会令人惊讶或无济于事。例如:

      myClass* p = new myClass[2];
      p->Fill("...");
      ++p;
      p->Fill("...");
      

      这里Fill 在两个不同的实例上被调用,但两者的名称都是“p”。 (忽略这个例子没有展示良好的内存管理实践的事实。我保持简单,只展示与这个问题相关的内容。)


      对于类实例具有名称的更好建议是将其视为您希望类具有的任何其他数据 - 将其携带在成员变量中。

      class myClass
      {
          string Name;
      
          public:
      
          myClass(string name)
          {
              Name = name;
          }
      
          void DoSomething()
          {
              cout << "My name is " << Name;
          }
      }
      

      然后使用所需的名称构造您的实例。

      myClass fred("Fred");
      

      【讨论】:

        猜你喜欢
        • 2014-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-29
        • 1970-01-01
        • 2022-10-14
        • 1970-01-01
        • 2016-11-02
        相关资源
        最近更新 更多