我正在尝试一些Scott Meyers有效C 的代码,特别是项目3。
他的书中的代码应该与此非常相似(他遗漏了构造函数)
#include <iostream>
class TextBlock {
public:
TextBlock(char* ptr) : ptrText(ptr)
{}
char& operator[](std::size_t pos) const {
return ptrText[pos];
}
private :
char* ptrText;
};
int main(int argc, char* argv[]) {
const TextBlock block("Hello");
std::cout << block[0] << std::endl;
char* ptr = &block[0];
*ptr = 'J';
std::cout << block[0];
}
在我更改指针ptr(*ptr ='j';)中的内容时,我会得到一个分割的故障(通常会在取消非初始化或释放指针时发生)。这不是在这里发生的, *ptr = 'J'
;
TextBlock
不拥有任何存储。它指向内存中的一个恒定字符串"Hello"
,您尝试修改只读内容。
如果您声明具有自己存储的本地变量,则可以使用:
char test[32] ;
strcpy( test, "Hello") ;
const TextBlock block( test) ;
char * ptr= &block[0] ;
*ptr= 'J' ;
您应该管理
ptrtext
成员不是指向禁止写入的恒定内存区域的指针,而是对您可以完全控制的基于堆栈或堆的对象的引用。
您可以使用char数组
#include <iostream>
#define MAX_LENGTH = 1024
class TextBlock {
public:
TextBlock(char* ptr)
{
memset(ptrText, 0, MAX_LENGTH);
memcpy(ptrText, ptr, strlen(ptr) < MAX_LENGTH?strlen(ptr):MAX_LENGTH);
}
char& operator[](std::size_t pos) const {
return ptrText[pos];
}
private :
char ptrText[MAX_LENGTH];
};
#include <iostream>
class TextBlock {
public:
TextBlock(char* ptr) : ptrText(ptr)
{}
char& operator[](std::size_t pos) const {
return ptrText[pos];
}
private :
char* ptrText;
};
int main(int argc, char* argv[]) {
char text[] = "Hello";
const TextBlock block(text);
std::cout << block[0] << std::endl;
char* ptr = &block[0];
*ptr = 'J';
std::cout << block[0];
}
是的,这是真的!ptrtext只是记录" Hello"的PTR,而" Hello"是您无法更改的const静态文本。