【leveldb源码】数据结构之Status

  • 内部定义枚举类,对状态进行描述
    在源码中,对于状态函数的msg2都赋值了默认参数,如下所示。java中因为默认参数和方法重载同时出现的时候有二义性的问题,而且java本身就减少了很多特性,所以,我们此处通过重载来解决默认参数的问题。

啊,翻译c++对我有难度,我的c++还给了老师,我对不起高老师,老师一定不希望我曝光他的名字,哭泣了

  // Return error status of an appropriate type.
  static Status NotFound(const Slice& msg, const Slice& msg2 = Slice()) {
    
    
    return Status(kNotFound, msg, msg2);
  }

十级警告!!!!

今天遇到了一个问题,在Status头文件中,声明了构造函数(注意!是声明,没有实现),而且是private类型的,且在这个类中的其他地方还调用了这个构造函数。我把他翻译为java的话,如果使用抽象类,则定义构造函数的时候必须实现,类的构造函数不能使用abstract关键字修饰。如果定义为接口的话,里面还有其他的函数是有函数体的,如果定义为普通类,则构造函数更应该有函数体了,场面一时陷入僵局,等我回头再解决这个问题。

解决问题:由于这个头文件只在status.cc中被引用了,没有第二个cpp文件引用,因此我就直接把实现写在这个类里面了。这真不是个好的解决方法,违背了作蛰将这个类作为基类,其他实现类自定义构造函数、toString函数的实现的初衷,但是,么的办法呀。

class LEVELDB_EXPORT Status {
    
    
 	public:
	 	static Status NotFound(const Slice& msg, const Slice& msg2 = Slice()) {
    
    
		    return Status(kNotFound, msg, msg2);
		}
		static Status Corruption(const Slice& msg, const Slice& msg2 = Slice()) {
    
    
		    return Status(kCorruption, msg, msg2);
		}
	private:
		Status(Code code, const Slice& msg, const Slice& msg2);

此外,在实现类中,上述构造函数并没有返回对象本身,那么NotFound、Corruption函数为什么会return一个Status类的对象呢。

解决问题:这问题问的太傻逼了,既然是构造函数,构造器就会返回这个类的实例,所以根本不同显式的返回对象,我一定是傻了。

Status::Status(Code code, const Slice& msg, const Slice& msg2) {
    
    
  assert(code != kOk);
  const uint32_t len1 = static_cast<uint32_t>(msg.size());
  const uint32_t len2 = static_cast<uint32_t>(msg2.size());
  const uint32_t size = len1 + (len2 ? (2 + len2) : 0);
  char* result = new char[size + 5];
  std::memcpy(result, &size, sizeof(size));
  result[4] = static_cast<char>(code);
  std::memcpy(result + 5, msg.data(), len1);
  if (len2) {
    
    
    result[5 + len1] = ':';
    result[6 + len1] = ' ';
    std::memcpy(result + 7 + len1, msg2.data(), len2);
  }
  state_ = result;
}

猜你喜欢

转载自blog.csdn.net/u010659877/article/details/108625264