我正在将TRESTRequest
对象用于 REST API调用,并希望多清理一些代码以使其更易用/可读。
以下是我的POST类的简化示例:
void clsAPI::createCategory(String name, int parentId)
{
RestRequest->Body->ClearBody(); // Empties RestRequest->Body
CustomJsonWriter->createCategory(RestRequest->Body->JSONWriter, name, parentId); // Pass the writer, to write the request
executeOnResource(rmPOST, "categories"); // Send JSON to server
}
现在我要更改这些呼叫:
来自:CustomJsonWriter->createCategory(RestRequest->Body->JSONWriter, name, parentId);
收件人:CustomJsonWriter->createCategory(name, parentId);
并使用指向CustomJsonWriter
的指针初始化我的RestRequest->Body->JSONWriter
void clsAPI::init() {
CustomJsonWriter = new clsCustomJsonWriter(RestRequest->Body->JSONWriter);
}
createCategory()
函数的内部包含一些类似内容(在实现类成员TJsonTextWriter * Writer)
之后:
void clsCustomJsonWriter::createCategory(String name, int parentId)
{
Writer->WriteStartObject();
Writer->WritePropertyName("category");
Writer->WriteStartObject();
Writer->WritePropertyName("name");
Writer->WriteValue(name);
Writer->WritePropertyName("parent_id");
Writer->WriteValue(parentId);
Writer->WriteEndObject();
Writer->WriteEndObject();
}
但是,这会使我的程序冻结。单步调试器显示该程序在Writer->WriteStartObject()
上冻结。当我发送JSONWriter
作为createCategory()
函数的参数时,并没有发生这种情况。
是否有一种不错的方式将RestRequest->Body->JSONWriter
用作我自己的CustomJsonWriter
的类成员?还是应该继续通过每个函数传递JSONWriter
?
编辑1:
我尝试在RestRequest->Body->JSONWriter
上使用指向指针的指针,但是无法获取指针地址。使用&RestRequest->Body->JSONWriter
;
编辑2:
我已经解决了这个问题,方法是使用CustomJsonWriter->setWriter(RestRequest->Body->JSONWriter);
并在每个REST请求之前调用此函数。
为什么?
通过推测/观察,我发现以下内容:JSONWriter
具有getter函数,该函数会在对象为空时对其进行初始化,以便可以将其写入。但是,如果已获取指向初始化对象的指针,则在通过指针访问对象时将不会调用getter函数。
在调用RestRequest->Body->ClearBody()
之后,这将导致NULL指针。似乎此函数删除了JSONWriter
并留下了一个悬空的指针。
示例:
TJSONWriter * pWriter = RestRequest->Body->JSONWriter; // Acquire a pointer
RestRequest->Body->ClearBody(); // RestRequest->Body->JSONWriter now becomes NULL
// Getter function will not be called from the pointer, so:
pWriter->Write("contents"); // Exception! pWriter points to NULL
pWriter = RestRequest->Body->JSONWriter; // Getter function is called, and initializes a new object/pointer to use.