【发布时间】:2013-11-27 22:18:44
【问题描述】:
MemRef 是一个简单的类,用于指向它不拥有的一些内存。
基类:
class MemRef {
protected:
const char * _ptr;
std::size_t _len;
public:
// Constructors
MemRef() : _ptr(0), _len(0) {}
MemRef(const string& s) : _ptr(s.c_str()), _len(s.length()) {}
MemRef(const char* b, size_t l) : _ptr(b), _len(l) {}
};
Loaded_MemRef 是一个子类,它提供自己的缓冲区,当不能信任调用者提供在 MemRef 的生命周期内保持分配和不变的内存时。 Loaded_MemRef 将数据复制到它控制的秘密缓冲区中,然后指向它,让我可以将其视为普通的 MemRef。
派生类:
class Loaded_MemRef : public MemRef {
private:
const string _memory;
public:
Loaded_MemRef(const string& s) : ??? {}
Loaded_MemRef(const char*);
Loaded_MemRef(const char*, const size_t);
};
我在为 Loaded_MemRef 创建 ctor 时遇到问题。在调用 MemRef 的 ctor 之前,我必须将调用者 首先 提供的内存复制到 _memory;否则 MemRef 无法检索到有效的 _memory.c_str()。但我的理解是,在初始化 Loaded_MemRef 的成员之前,必须先调用 MemRef(_memory)。所以我尝试了这个:
Loaded_MemRef(const string& str) :
MemRef(), // get this over with
_memory(str), // copy str into _memory
MemRef::_ptr(_memory.c_str()), // (LINE 108) "reach up into" MemRef and set its protected members
MemRef::_len(_memory.length())
{}
这抱怨:
MemRef.cpp: In constructor 'Loaded_MemRef::Loaded_MemRef(const std::string&)':
MemRef.cpp:108: error: expected class-name before '(' token
MemRef.cpp:108: error: expected '{' before '(' token
(上面指出了第 108 行;下一行,设置 _len,不会被标记,尽管编译器可能会被保释。)
这样做的正确方法是什么?
【问题讨论】:
-
为什么
Loaded_MemRef会有这么奇怪的构造函数? -
@KerrekSB:一个用于字符串引用,一个用于空终止 c 字符串,一个用于缓冲区(无空终止,需要长度)。
标签: c++ inheritance constructor derived-class