使用TRESTRequest内部的TJsonTextWriter作为类成员吗?

时间:2018-08-10 10:02:25

标签: c++ c++builder

我正在将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.

0 个答案:

没有答案