您的位置:首页 > 编程语言 > C语言/C++

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: