【问题标题】:How to initialize a const pointer to a const data of unknown size (need alloc)如何初始化一个指向未知大小的常量数据的常量指针(需要分配)
【发布时间】:2015-06-21 08:12:03
【问题描述】:

我有以下课程:

class A {
    A(B* b, unsigned int size_in);
private:

    unsigned int size;

    // Pointer whose address and pointed-to data shouldn't be changed
    const char* const p1;

    // Pointer which should hold a copy of p1's data (at another location in the memory).
    // Shouldn't ever be changed once copied from p1
    const char* const p1_copy;
};

我正在尝试了解我应该如何构建构造函数,我想要一些这样的功能:

A::A(B* b, unsigned int size_in) :
  size(size_in), p1(b->GetPtr() + b->GetOffset())
{
  p1_copy = new char[size];
  memcpy(p1_copy, p1, size);
}

但我显然不能对 p1_copy 这样做,因为它是 const 并且只能在初始化列表中进行初始化(memcpy 也不能将 const 指针用作第一个参数)。

仅供参考:构造函数执行后,我永远不会更改p1p1_copy

这样做的正确方法是什么?

谢谢!

【问题讨论】:

    标签: c++ pointers constructor constants


    【解决方案1】:

    一种选择是创建一个复制字符串的函数:

    char* copyString(const char* s, size_t size) {
        char* copy = new char[size];
        memcpy(copy, s, size);
        return copy;
    }
    
    A::A(B* b, unsigned int size_in) :
      size(size_in), p1(b->GetPtr() + b->GetOffset()),
      p1_copy(copyString(p1, size_in))
    {
    }
    

    我更喜欢的另一种选择是使用std::string 而不是原始指针:

    class A {
        //...
        const std::string p1_copy;
    };
    
    A::A(B* b, unsigned int size_in) :
      size(size_in), p1(b->GetPtr() + b->GetOffset()),
      p1_copy(p1, p1 + size_in)
    {
    }
    

    【讨论】:

      【解决方案2】:

      对此可能有几种不同的解决方案,但这是 const_cast 设计的典型情况 - 您暂时想要覆盖某些东西的 constness。

      所以,你想要类似的东西(它可以在没有临时变量的情况下完成,但你需要更多的 const_cast 操作,而且不太清楚。

        char* tmp = new char[size];
        memcpy(tmp, p1, size);
        const_cast<const char*>(p1_copy) = tmp;
      

      【讨论】:

        【解决方案3】:

        不确定这是否是正确/最好的方法,但你不能做类似的事情

        const char* copy(const char* a, int size) {
            const char* ret = new char[size];
            memcpy(ret, a, size);
            return ret;
        }
        

        然后

        A::A(B* b, unsigned int size_in) :
          size(size_in), p1(b->GetPtr() + b->GetOffset()), p1_copy(copy(p1, size)) {}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-23
          • 1970-01-01
          相关资源
          最近更新 更多