2 fd lrh fd_lrh 于 2016.01.16 22:47 提问

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:\Users\ADMINI~1\AppData\Local\Temp\cchmbeUn.o    13-48.cpp:(.rdata$.refptr._ZN6String5allocE[.refptr._ZN6String5allocE]+0x0): undefined reference to `String::alloc'
E:\Programming\C & C++\CppPrimer\CppPrimer\3rd Part\collect2.exe    [Error] ld returned 1 exit status

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

2个回答

caozhy
caozhy   Ds   Rxr 2016.01.16 22:56

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

fd_lrh
fd_lrh 但是我还是没有理解,定义的话应该在哪儿,如何定义呢?private的第一行不是对alloc的定义吗?
接近 2 年之前 回复
fd_lrh
fd_lrh 这是g++的报错
接近 2 年之前 回复
fd_lrh
fd_lrh /tmp/ccZPL0Ob.o:在函数‘String::String(String const&)’中: 13-48.cpp:(.text+0x2e):对‘String::alloc’未定义的引用 /tmp/ccZPL0Ob.o:在函数‘String::free()’中: 13-48.cpp:(.text+0xba):对‘String::alloc’未定义的引用 /tmp/ccZPL0Ob.o:在函数‘String::operator=(String const&)’中: 13-48.cpp:(.text+0x102):对‘String::alloc’未定义的引用 /tmp/ccZPL0Ob.o:在函数‘add(String const&, String const&)’中: 13-48.cpp:(.text+0x1bc):对‘String::alloc’未定义的引用 collect2: 错误:ld 返回 1
接近 2 年之前 回复
fd_lrh
fd_lrh private的第一行啊
接近 2 年之前 回复
91program
91program   Ds   Rxr 2016.01.16 23:36

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

fd_lrh
fd_lrh 的确如果不声明静态就没问题了,然而这儿的确应该声明静态.书上没有String.h的代码,可是之前的一个StrVec.h的代码也是对allocator类声明了静态来分配内存的.
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!