类的成员函数内部声明另一个类是什么语法
类Message的成员函数内部声明了另一个类ReflectiveFieldParser ;
代码是protobuf-master 里面的,src/google/protobuf/message.cc line_377---line_518,之前没见过这样的c++语法。
const char* Message::_InternalParse(const char* ptr,
internal::ParseContext* ctx) {
class ReflectiveFieldParser {
public:
ReflectiveFieldParser(Message* msg, internal::ParseContext* ctx)
: ReflectiveFieldParser(msg, ctx, false) {}
void AddVarint(uint32 num, uint64 value) {
if (is_item_ && num == 2) {
if (!payload_.empty()) {
auto field = Field(value, 2);
if (field && field->message_type()) {
auto child = reflection_->MutableMessage(msg_, field);
// TODO(gerbens) signal error
child->ParsePartialFromString(payload_);
} else {
MutableUnknown()->AddLengthDelimited(value)->swap(payload_);
}
return;
}
type_id_ = value;
return;
}
auto field = Field(num, 0);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddVarint(num, value);
}
}
void AddFixed64(uint32 num, uint64 value) {
auto field = Field(num, 1);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddFixed64(num, value);
}
}
const char* ParseLengthDelimited(uint32 num, const char* ptr,
internal::ParseContext* ctx) {
if (is_item_ && num == 3) {
if (type_id_ == 0) {
return InlineGreedyStringParser(&payload_, ptr, ctx);
}
num = type_id_;
type_id_ = 0;
}
auto field = Field(num, 2);
if (field) {
return ParseLenDelim(num, field, msg_, reflection_, ptr, ctx);
} else {
return InlineGreedyStringParser(
MutableUnknown()->AddLengthDelimited(num), ptr, ctx);
}
}
const char* ParseGroup(uint32 num, const char* ptr,
internal::ParseContext* ctx) {
if (!is_item_ && descriptor_->options().message_set_wire_format() &&
num == 1) {
is_item_ = true;
ptr = ctx->ParseGroup(this, ptr, num * 8 + 3);
is_item_ = false;
type_id_ = 0;
return ptr;
}
auto field = Field(num, 3);
if (field) {
auto msg = GetGroup(num, field, msg_, reflection_);
return ctx->ParseGroup(msg, ptr, num * 8 + 3);
} else {
return UnknownFieldParse(num * 8 + 3, MutableUnknown(), ptr, ctx);
}
}
void AddFixed32(uint32 num, uint32 value) {
auto field = Field(num, 5);
if (field) {
SetField(value, field, msg_, reflection_);
} else {
MutableUnknown()->AddFixed32(num, value);
}
}
const char* _InternalParse(const char* ptr, internal::ParseContext* ctx) {
// We're parsing the a MessageSetItem
GOOGLE_DCHECK(is_item_);
return internal::WireFormatParser(*this, ptr, ctx);
}
private:
Message* msg_;
const Descriptor* descriptor_;
const Reflection* reflection_;
internal::ParseContext* ctx_;
UnknownFieldSet* unknown_ = nullptr;
bool is_item_ = false;
uint32 type_id_ = 0;
std::string payload_;
ReflectiveFieldParser(Message* msg, internal::ParseContext* ctx,
bool is_item)
: msg_(msg),
descriptor_(msg->GetDescriptor()),
reflection_(msg->GetReflection()),
ctx_(ctx),
is_item_(is_item) {
GOOGLE_CHECK(descriptor_) << msg->GetTypeName();
GOOGLE_CHECK(reflection_) << msg->GetTypeName();
}
const FieldDescriptor* Field(int num, int wire_type) {
auto field = descriptor_->FindFieldByNumber(num);
// If that failed, check if the field is an extension.
if (field == nullptr && descriptor_->IsExtensionNumber(num)) {
const DescriptorPool* pool = ctx_->data().pool;
if (pool == nullptr) {
field = reflection_->FindKnownExtensionByNumber(num);
} else {
field = pool->FindExtensionByNumber(descriptor_, num);
}
}
if (field == nullptr) return nullptr;
if (internal::WireFormat::WireTypeForFieldType(field->type()) !=
wire_type) {
if (field->is_packable()) {
if (wire_type ==
internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) {
return field;
}
}
return nullptr;
}
return field;
}
UnknownFieldSet* MutableUnknown() {
if (unknown_) return unknown_;
return unknown_ = reflection_->MutableUnknownFields(msg_);
}
};
ReflectiveFieldParser field_parser(this, ctx);
return internal::WireFormatParser(field_parser, ptr, ctx);
}代码是protobuf-master 里面的,src/google/protobuf/message.cc line_377---line_518,之前没见过这样的c++语法。
...全文
相关推荐
const修饰类的成员函数
比较好的一本学习c数据结构,算法的书,书的内容丰富。有许多代码案例,通俗易懂
这个C++程序定义了一个BankAccount类,该类具有用于存款、取款和显示帐户余额的成员函数.zip
这个C++程序定义了一个BankAccount类,该类具有用于存款、取款和显示帐户余额的成员函数.zip
C类的定义和声明-C教程共2页.pdf.zip
C类的定义和声明_C教程共2页.pdf.zip
C++类与对象
类是C++语言面向对象程序设计的基础,在 C++语言面向对象程序设计中占据着核心地位。 在面向对象的程序设计中,C++程序就是由类的 实例——对象构成的。 本章将详细介绍有关类及对象的基本知识,并开始采用面向对象程序设计方法进行C++编程。
C++ 新建类函数及调用
描述了C++中新建类的方法,以及如何调用类中的函数,开发环境为vs2008


