【问题标题】:Convert "this" pointer to string将“this”指针转换为字符串
【发布时间】:2011-12-12 14:27:25
【问题描述】:

在注册对象必须具有唯一名称的系统中,我想在名称中使用/包含对象的 this 指针。我想要最简单的方法来创建??? where:

std::string name = ???(this);

【问题讨论】:

  • 将其转换为代表地址的十六进制字符串?
  • 查看这个问题的答案:stackoverflow.com/questions/1255366/…
  • 听起来是个坏主意:您将对象的身份与其内存位置联系起来:如果您尝试在应用程序的未来版本中移动它怎么办?您的代码将以非常不愉快的方式中断。
  • 同意,如果您想要为每个对象拥有唯一的名称,只需在您的类的构造函数中分配一个不同的字符串。
  • 如果您的应用程序可以有多个实例,您的方法可能会失败,因为不同的实例可能具有相同的(虚拟)地址。

标签: c++ pointers stl


【解决方案1】:

你可以使用 ostringstream 这个指针的地址,然后把那个 ostringstream 的值作为字符串?

【讨论】:

    【解决方案2】:

    您可以使用地址的字符串表示:

    #include <sstream> //for std::stringstream 
    #include <string>  //for std::string
    
    const void * address = static_cast<const void*>(this);
    std::stringstream ss;
    ss << address;  
    std::string name = ss.str(); 
    

    【讨论】:

    • 我在没有强制转换为 void* 的情况下进行了测试,它也有效。由于某些原因有必要吗?
    • ss &lt;&lt; this 可能会调用operator&lt;&lt;,它接受T const * const 作为参数,在这种情况下,您不会将地址作为字符串获取。这就是我的意思:coliru.stacked-crooked.com/a/cded799e93012de6
    【解决方案3】:
    #include <sstream>
    #include <iostream>
    struct T
    {
        T()
        {
            std::ostringstream oss;
            oss << (void*)this;
            std::string s(oss.str());
    
            std::cout << s << std::endl;
        }
    };
    
    int main()
    {
        T t;
    } 
    

    【讨论】:

      【解决方案4】:

      您的意思是将指针本身格式化为字符串?

      std::ostringstream address;
      address << (void const *)this;
      std:string name = address.str();
      

      或者......是的,在我输入此内容的时间内所有其他等效答案!

      【讨论】:

        【解决方案5】:

        在注册对象必须具有唯一名称的系统中,我想在名称中使用/包含对象的 this 指针。

        对象的地址不一定是唯一的。示例:您动态分配这样一个对象,使用一段时间,删除它,然后分配另一个这样的对象。新分配的对象很可能与之前的对象地址相同。

        有更好的方法来为某物生成一个唯一的名称。一个 gensym 计数器,例如:

        // Base class for objects with a unique, autogenerated name.
        class Named {
        public:
          Named() : unique_id(gensym()) {}
          Named(const std::string & prefix) : unique_id(gensym(prefix)) {}
        
          const std::string & get_unique_id () { return unique_id; }
        
        private:
          static std::string gensym (const std::string & prefix = "gensym");
          const std::string unique_id;
        };  
        
        inline std::string Named::gensym (const std::string & prefix) {
          static std::map<std::string, int> counter_map;
          int & entry = counter_map[prefix];
          std::stringstream sstream;
          sstream << prefix << std::setfill('0') << std::setw(7) << ++entry;
          return sstream.str();
        }   
        
        // Derived classes can have their own prefix. For example,
        class DerivedNamed : public Named {
        public:
          DerivedNamed() : Named("Derived") {}
        };  
        

        【讨论】:

        • 但是一旦第一个对象被销毁,它就不存在了。所以地址是唯一的......如果我销毁第一个对象,它也会从需要名称的数据结构中注销。
        猜你喜欢
        • 2013-03-06
        • 2019-05-09
        • 2012-04-26
        • 2013-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多