C++primer第五版第13小节String类碰到的问题
2016-11-24 10:57
183 查看
关于在VecStr类内设置static allocator变量,因为类内只能声明不能定义,所以需要在类外在声明一次编译才能通过,这是上一小节碰到的问题总结的。但是这次编译String类,按照VecStr为模板来改,但是再加上String(const String&);这样的构造函数后,再次使用类似String a(“”asd“”)这样的函数会报错。通过调试注释掉了//String() :element(nullptr), first_free(nullptr) {}加上了String() :String("")
{}这样一个初始化的构造函数。通过调用String(const char*)中的reinitializer函数中的allocator中allocate来分配内存借此初始化类中的allocator类变量,然后主程序编译成功。
以下是String类
#include<memory>
#include<utility>
class String {
public:
String() :String("") {}
//初始化allocator通过String(const char*)构造函数中的reinitilizer函数进行初始化
//String() :element(nullptr), first_free(nullptr) {}
String(const String&);
String &operator=(const String&);
String(const char*);
~String();
size_t size() { return first_free - element; }
size_t length() { return first_free - element - 1; }
char *c_str()const { return element; }
bool empty() { return!size(); }
private:
std::pair<char*, char*> alloc_n_back(const char*, const char*);
void reinitializer(const char*, const char*);
void free();
private:
char *element;
char *first_free;
static std::allocator<char> alloc;
};
std::allocator<char> String::alloc;
std::pair<char*, char*> String::alloc_n_back(const char *b, const char *e)
{
auto data = alloc.allocate(e - b);
return{ data, std::uninitialized_copy(b, e, data) };
}
void String::reinitializer(const char *first, const char *last)
{
auto newdata = alloc_n_back(first, last);
element = newdata.first;
first_free = newdata.second;
}
String::String(const char *s)
{
char *s_1 = const_cast<char*>(s);
while (*s_1++);
reinitializer(s, s_1);
}
String::String(const String &s_1)
{
reinitializer(s_1.element, s_1.first_free);
std::cout << "as" << std::endl;
}
void String::free()
{
if (element)
{
std::for_each(element, first_free, [](char &a) {alloc.destroy(&a); });
//lambda里的&引用符号一定不能忘记
alloc.deallocate(element,first_free-element);
}
}
String::~String()
{
free();
}
String &String::operator=(const String &s_1)
{
auto data = alloc_n_back(s_1.element, s_1.first_free);
free();
element = data.first;
first_free = data.second;
std::cout << "cp-as" << std::endl;
return *this;
}
{}这样一个初始化的构造函数。通过调用String(const char*)中的reinitializer函数中的allocator中allocate来分配内存借此初始化类中的allocator类变量,然后主程序编译成功。
以下是String类
#include<memory>
#include<utility>
class String {
public:
String() :String("") {}
//初始化allocator通过String(const char*)构造函数中的reinitilizer函数进行初始化
//String() :element(nullptr), first_free(nullptr) {}
String(const String&);
String &operator=(const String&);
String(const char*);
~String();
size_t size() { return first_free - element; }
size_t length() { return first_free - element - 1; }
char *c_str()const { return element; }
bool empty() { return!size(); }
private:
std::pair<char*, char*> alloc_n_back(const char*, const char*);
void reinitializer(const char*, const char*);
void free();
private:
char *element;
char *first_free;
static std::allocator<char> alloc;
};
std::allocator<char> String::alloc;
std::pair<char*, char*> String::alloc_n_back(const char *b, const char *e)
{
auto data = alloc.allocate(e - b);
return{ data, std::uninitialized_copy(b, e, data) };
}
void String::reinitializer(const char *first, const char *last)
{
auto newdata = alloc_n_back(first, last);
element = newdata.first;
first_free = newdata.second;
}
String::String(const char *s)
{
char *s_1 = const_cast<char*>(s);
while (*s_1++);
reinitializer(s, s_1);
}
String::String(const String &s_1)
{
reinitializer(s_1.element, s_1.first_free);
std::cout << "as" << std::endl;
}
void String::free()
{
if (element)
{
std::for_each(element, first_free, [](char &a) {alloc.destroy(&a); });
//lambda里的&引用符号一定不能忘记
alloc.deallocate(element,first_free-element);
}
}
String::~String()
{
free();
}
String &String::operator=(const String &s_1)
{
auto data = alloc_n_back(s_1.element, s_1.first_free);
free();
element = data.first;
first_free = data.second;
std::cout << "cp-as" << std::endl;
return *this;
}
相关文章推荐
- 关于C++primer第五版(中文)第一章中提到的文件重定向问题的记录
- C++primer第五版书店问题
- 关于C++primer第五版(中文)第一章中提到的文件重定向问题的记录
- 我在做一个项目中碰到的loadLibrary的问题
- 安装Eclipse和Lomboz碰到的一些问题
- 困惑中:remoting技术在服务器端激活的HTTP通道模式下,碰到的奇怪问题。
- 安装Eclipse和Lomboz碰到的一些问题 (zz)
- 俺现在碰到一些问题请大家帮忙???
- 使用TreeView控件碰到的问题
- 今天安装GT3.9.5碰到的问题
- 2005-3-1 总是碰到棘手的问题
- 碰到了一个GDI+的问题,郁闷ing。。。
- 知道了一个几年前就碰到没有解决的问题
- EXCEL下使用MATCH函数碰到的问题
- 今天碰到的Acrobat Reader 7的问题
- 网页标准在实践中所碰到的小问题
- 困扰已久的asp.net创建目录失败问题,今日解决,若有碰到此问题的分享一下
- 不知为何,最近碰到一个问题在上传.mdb,.bak,.exl,.iso等文件时会很慢,或不成功。
- Delphi中的DLL封装和调用对象编写碰到的问题
- 写多进程程序碰到的一个问题