【问题标题】:TSQLQuery, TFields and operator []TSQLQuery、TFields 和运算符 []
【发布时间】:2017-04-13 21:58:47
【问题描述】:

我有一个查询,使用像这样的 TSQLQuery

TSQLQuery* tq = new TSQLQuery(NULL);
tq->SQLConnection = atdbDM->SQLConnection1;
tq->SQL->Add("SELECT LAST_INSERT_ID();");
tq->Open();
int insert_id = tq->Fields->operator [](0)->AsInteger;

表达式

int insert_id = tq->Fields->operator [](0)->AsInteger;

相当笨重。看实现,operator[]在header中被重载了:

public:
    TField* operator[](int Index) { return Fields[Index]; }

但是,如果我打电话:

int insert_id = tq->Fields[0]->AsInteger;

我得到编译器错误:

[bcc32 Error] TRegisterFreshCSBatchForm.cpp(97): E2288 Pointer to structure 
required on left side of -> or ->*
TRegisterFreshCSBatchForm::mRegisterBtnClick(TObject *)

任何想法为什么上述调用不编译?我一定是错过了什么..

【问题讨论】:

    标签: c++ c++builder vcl dbexpress


    【解决方案1】:

    正确的语法是

    int insert_id = (*tq->Fields)[0]->AsInteger;
    

    必须有一个类对象,而不是指针,才能让重载的运算符生效。

    【讨论】:

    • 替代方法是根本不使用TFields::operator[],直接使用TFields::Fields[] 属性:int insert_id = tq->Fields->Fields[0]->AsInteger; TFields::operator[] 除了额外的CALL 并没有真正为您带来任何好处操作说明。它存在于 C++ 中的唯一原因是在访问 default 属性时提供更接近 Delphi 语法的 C++ 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 2020-01-25
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多