如何初始化指向未知大小的常量数据的常量指针(需要分配)
How to initialize a const pointer to a const data of unknown size (need alloc)
我有以下类:
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
指针作为第一个参数)。
仅供参考:执行构造函数后,我永远不会更改p1
或p1_copy
。
正确的方法是什么?
谢谢!
一种选择是创建一个函数来复制字符串:
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)
{
}
可能有一些
不同的解决方案,但这是const_cast
设计的典型情况 - 您暂时想要覆盖某些东西的const
性。
所以,你想要类似的东西(它可以在没有临时变量的情况下完成,但你需要更多const_cast操作,而且它不太清楚。
char* tmp = new char[size];
memcpy(tmp, p1, size);
const_cast<const char*>(p1_copy) = tmp;
不确定这是否是正确/最好的方法,但你不能做类似的事情吗
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)) {}
相关文章:
- 将常量指针引用绑定到非常量指针
- 如何使用数据对象上的常量指针初始化类
- 为什么我收到"从常量指针到指针的转换无效?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 是否可以使用非常量指针调用非常量函数,以及当两个unique_ptrs指向同一个对象时程序的行为方式?
- 为什么C++中没有常量引用,就像常量指针一样?
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 将常量指针强制转换为非常量
- 带有常量指针的矢量构造函数示例
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 在多线程函数中返回共享的常量指针会导致计时问题吗?
- 常量指针上的混乱
- 使用 static_cast 时指向常量指针的原因
- 如何在C++中定义常量指针数组?
- 测试此指针的常量指针性质
- 当常量指针用作函数的参数时
- C++ - 无法将顶部常量指针分配给另一个非常量指针
- 在不同类型之间转换常量指针
- 解构常量指针?
- 为什么 std::vector<>::const_reference 可以转换为非常量指针?