【问题标题】:Is it possible to create structure with C like string (char *) data settable only once?是否可以使用 C 之类的字符串 (char *) 数据可设置一次的结构创建结构?
【发布时间】:2012-02-20 03:19:38
【问题描述】:

是否可以用 C 类的字符串(char *)数据只设置一次来创建结构?

会是这样的:

struct raw {
 static const char * request;
};

我需要的是数据结构,它只能写入一次,并且对于这个东西应该是 string.c_str() 的可转换结果,有什么方法可以在 C++ 中创建这样的东西吗?

【问题讨论】:

  • 如果可能,我不想实现读/写基础设施。
  • 每件事只有一次?每个结构实例或每个进程生命周期?
  • 为什么需要它像C? shall be convertible result of string.c_str() 你是什么意思?它应该可以从 const char* 构造,还是必须可以用作 C 字符串?
  • 一个类有什么问题?将数据设为私有并提供公共构造函数...
  • const std::string 呢?

标签: c++ string struct char


【解决方案1】:

您应该说明要解决的问题是什么,而不是您想要解决的问题。您真正需要什么?

你的问题的答案其实很简单,但我担心你的设计问题更深...

 struct raw {
    const char * const data;
 };

 raw r = { "hi there" };

或者你可以(应该)提供一个构造函数。现在,如果您打算使用对字符串的c_str() 调用的结果来初始化它,那么您肯定会遇到麻烦,因为返回的指针仅在修改字符串的下一个操作之前有效。你可以strdup c 字符串,但是你必须管理重复的字符串...

【讨论】:

    【解决方案2】:

    你可以这样做:

    struct raw {
      raw(const char* request_in) { request = request_in; }
      const char* request;
    };
    

    【讨论】:

      【解决方案3】:

      良好的旧封装有什么问题?问题标签上写着 C++,因此允许使用类和私有数据。在类场景中,私有变量可由类方法写入,但不能由程序的其余部分写入。这将覆盖的风险降低到可以忽略不计。

      另一方面,如果您要防范的是超级错误和恶意影响,那么只有通过内存保护进行操作才会有所帮助。在 Windows 上,这是通过 VirtualAlloc()/VirtualProtect() API 完成的。

      【讨论】:

        【解决方案4】:

        然后这样:

        struct raw {
            raw(const char* request_in):request(request_in) {}
            const char* const request;
        };
        

        【讨论】:

          猜你喜欢
          • 2018-07-23
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多