c++-C++Primer,定义的String类的问题

问题描述

C++Primer,定义的String类的问题

在学习C++Primer第13章时,定义的类Spring代码如下:

 #ifndef STRING_H
#define STRING_H
#include <memory>
#include <cstring>
#include <algorithm>
#include <iostream>

class String {
    friend String add(const String&, const String&);
public:
    // constructor
    String(): sz(0), p(nullptr) {   }
    String(const char *cp): sz(std::strlen(cp)), p(alloc.allocate(sz))
        { std::uninitialized_copy(cp, cp + sz, p); }
    // copy control
    String(const String&);
    String& operator=(const String&);
    ~String();
private:
    static std::allocator<char> alloc;
    void free();
    size_t sz;
    char *p;
};

String::String(const String &s): sz(s.sz), p(alloc.allocate(s.sz)) {
    std::uninitialized_copy(s.p, s.p + s.sz, p);
    std::cout << "String(const String&);" << std::endl;
}

void String::free() {
    if (p) alloc.deallocate(p, sz);
}

String::~String() { free(); }

String& String::operator=(const String &rhs) {
    auto newp = alloc.allocate(rhs.sz);
    std::uninitialized_copy(rhs.p, rhs.p + rhs.sz, newp);
    free();
    p = newp;
    sz = rhs.sz;
    std::cout << "String& operator=(const String&);" << std::endl;
    return *this;
}

String add(const String &s1, const String &s2) {
    String newStr;
    newStr.p = String::alloc.allocate(s1.sz + s2.sz);
    newStr.sz = s1.sz + s2.sz;
    std::uninitialized_copy(s2.p, s2.p + s2.sz,
        std::uninitialized_copy(s1.p, s1.p+s1.sz, newStr.p));
    return newStr;
}

#endif

然而,在用如下代码调试时始终报错:

 #include <vector>
#include "String.h"

int main()
{
    std::vector<String> vec;
    String s1("Hello");
    String s2("World");
    vec.push_back(s1);
    vec.push_back(s2);

    return 0;
}

报错内容为:

 C:UsersADMINI~1AppDataLocalTempcchmbeUn.o    13-48.cpp:(.rdata$.refptr._ZN6String5allocE[.refptr._ZN6String5allocE]+0x0): undefined reference to `String::alloc'
E:ProgrammingC & C++CppPrimerCppPrimer3rd Partcollect2.exe    [Error] ld returned 1 exit status

然而String.h文件可以编译通过,不理解错误在哪里,求教。谢谢。

解决方案

String::alloc没有定义,你在哪里定义的。

解决方案二:

alloc是静态,私有的?是不是搞错了。你再看看书上的代码。

时间: 2024-11-02 22:20:48

c++-C++Primer,定义的String类的问题的相关文章

java 学习 String类 和 StringBuffer类的用法 暑假第九天

 /*    java.lang.String    String 类所在的包 String str=new String("abc");  java的对象是通过引用来实现的   str引用的是 存放内容为 abc的内存地址  所以即使内容相等但是对象实不相等的 对象是不能用==比较的即使内容相等  但是 比较的却是内容的地址   要比较用  equals 方法  这个函数在object中定义 在String类中重写  int byte  char  long double float

在类中使用string类的问题。我定义的构造函数,想把字符串赋给string对象,却实现不了。

问题描述 在类中使用string类的问题.我定义的构造函数,想把字符串赋给string对象,却实现不了. //12.2.ano.h #ifndef STRING2_H_ #define STRING2_H_ #include #include using std::string; using std::cout; using std::cin; using std::endl; class String { private : string str; public : String(); Str

c++-C++ string类 标准库 字符串

问题描述 C++ string类 标准库 字符串 C++标准库提供了一个功能强大的String类来实现字符串的操作,本系统创建一个功能类似"String类"的小型字符串类,以实现类似的字符处理功能求大神帮解决用C++ 解决方案 http://zhidao.baidu.com/link?url=75L1-WX-G-cxzSWytaJDkPNRF23cR08MvvIGyUSSG5ykmN9bh-A-0IFWPGBMKoMYkPJ0luXNApuvYXYT0TJQKa 解决方案二: <

c++基础-关于c++primer第五版类的一个问题

问题描述 关于c++primer第五版类的一个问题 230页 struct Sales_data { std::string isbn( ) const { return bookNo;} Sale_data& combine (const Sales_data& ); double avg_price () const: std::string bookNo; unsigned units_sold = 0; double revenue = 0.0; }; Sales_data add

c++-C++中字符数组转 string类引用问题

问题描述 C++中字符数组转 string类引用问题 函数定义: void fun(const string &s){ cout<<s<<endl; } 如果调用fun("hello"),可以正确编译.但是如果把函数定义中的const去掉,则不能正确编译. 问字符数组"hello"是通过什么方式装换成const string &类型的,是某种强制转换吗? 我再C++ primer里没找到相关说明,如有知道的说明下哪本书,那页有

string类的两个问题

问题描述 看C++ primer 第四版(英文版)遇到了几个问题,请赐教!问题1:用string,vector等包含的库是不是在iostream中有说明呢?在C++ primer的p132中提及When we compare library strings...这个意思不是要包含strings库吗?但是我在预编译加上#include<strings>g++会报错(没有这个文件)?问题2:在C++ primer的p86指出当一个string对象st1用另外一个string类对象str2赋值时所作

Java的string类常量池及不可变性

1.String常量池     当使用new String("hello")时,JVM会先使用常量池来管理"hello"直接量,再调用String类的构造器来创建一个新的String对象,新创建的对象被保存在堆内存中.即new String("hello")一共产生了两个字符串对象. [常量池constant pool]管理在编译时被确定并保存在已编译的.class文件中的一些数据,包括关于类.方法.接口中的常量,和字符串常量.  [字符串常量池

C++面试中string类的一种正确写法

C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值.复制. 能用作函数的参数类型及返回类型. 能用作标准库容器的元素类型,即 vector/list/deque 的 value_type.(用作 std::map 的 key_type 是更进一步的要求,本文从略). 换言之,你的 String 能让以下代码编译运行通过,并且没有内存方面的错误. 1

c++-在头文件里定义一个string name; 变量,编译报错

问题描述 在头文件里定义一个string name: 变量,编译报错 //Parent.h class Parent { public: Parent(void); ~Parent(void); private: string name; }; //main.cpp #include #include #include "Parent.h" using namespace std; void main() { system("pause"); } //Parent.