如何将 const 指针初始化为未知大小的 const 数据(需要分配)
How to initialize a const pointer to a const data of unknown size (need alloc)
我有以下 class:
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 这样做,因为它是常量并且只能在初始化列表中初始化(而且 memcpy
不能与 const
一起使用指针作为第一个参数)。
仅供参考:构造函数执行后,我将永远不会更改p1
或p1_copy
。
执行此操作的正确方法是什么?
谢谢!
对此可能有几种不同的解决方案,但这是 const_cast
设计的典型案例 - 您暂时想要覆盖某些东西的 const
ness。
所以,你想要类似的东西(它可以在没有临时变量的情况下完成,但你需要更多 const_cast 操作,而且不太清楚。
char* tmp = new char[size];
memcpy(tmp, p1, size);
const_cast<const char*>(p1_copy) = tmp;
一个选项可能是创建一个函数来复制字符串:
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)
{
}
不确定这是否是 proper/best 方式,但你不能做类似
的事情吗
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)) {}
我有以下 class:
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 这样做,因为它是常量并且只能在初始化列表中初始化(而且 memcpy
不能与 const
一起使用指针作为第一个参数)。
仅供参考:构造函数执行后,我将永远不会更改p1
或p1_copy
。
执行此操作的正确方法是什么?
谢谢!
对此可能有几种不同的解决方案,但这是 const_cast
设计的典型案例 - 您暂时想要覆盖某些东西的 const
ness。
所以,你想要类似的东西(它可以在没有临时变量的情况下完成,但你需要更多 const_cast 操作,而且不太清楚。
char* tmp = new char[size];
memcpy(tmp, p1, size);
const_cast<const char*>(p1_copy) = tmp;
一个选项可能是创建一个函数来复制字符串:
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)
{
}
不确定这是否是 proper/best 方式,但你不能做类似
的事情吗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)) {}