0

AddObjectC++ Builder 6 でメソッドを使用するのはこれが初めてですがTStringList 、たとえば、オブジェクト リストに整数を追加することはできません。もちろん、さまざまなタイプをキャストすることでそれを行いました。しかし、それは私が望むものではありません。より簡単にするのを手伝ってください。なぜオブジェクトがTobject*オブジェクトリストにある必要があるのか​​ 、これは私の単純なプログラムです...

#include <vcl.h>
#include <iostream.h>
#include <conio.h>
#pragma hdrstop
#pragma argsused

int main(int argc, char* argv[])
{
    int r=random(100+1);
    TStringList *mylist=new TStringList;
    mylist->AddObject("r",(TObject *)r);
    int i=mylist->IndexOf("r");
    int a=(int)(mylist->Objects[i]);
    cout<<a<<endl;
    getch();
    return 0;
} 
4

3 に答える 3

0

オブジェクトが Tobject* でなければならない理由

Borland の VCL の設計によるものです。

mylist->AddObject("r",(TObject *)r);

insideTStringListのいくつかのメソッドを呼び出さないという保証はないため、これを行わないでください。たとえば、orを呼び出すことができます(ないことはわかっていますが、これは単なる例です)。TObject*AddObjectobjectName()incrementReference()TStringList::incrementReference()

私見、必要なのはstd::mapだけです:

#include <map>

int main()
{
    int r=random(100+1);
    std::map< AnsiString, int > myList;
    myList[ "r" ] = r;
    int a = myList[ "r" ];
}
于 2014-05-29T08:15:20.080 に答える
0

とても醜いですが、キャストはうまくいきます。実用的なアプローチは、TStringList を使用する必要がある場合は、その方法に固執することです。

必要に応じて、「int」を保持する TObject 派生ラッパーを別のベクトルに追加して、これらのポインターを使用することもできますが、その 2 番目のリストを維持するためにより多くのコードが必要になり、エラーが発生しやすくなり、速度が大幅に低下します。

または、これらのラッパーを新しく作成して文字列リストに追加し、オブジェクトの削除を手動で管理します。これはエラーが発生しやすいです。

最善の方法は、可能であれば TStringList を捨てることです。構造体/クラスまたは std::pair と std::vector または std::deque を使用します。

例えば

typedef std::pair<AnsiString, int> MyValue;
typedef std::vector<MyValue> MyValueList;

MyValueList list;
list.push_back(MyValue("hello", 1));

AnsiString const& s = list[0].first;
int i = list[0].second;
于 2014-05-29T08:25:33.503 に答える