webForumDet fria alternativet

Anonym vektor med pekare

C/C++

3 svar · 215 visningar · startad av Robban

Medlem sedan dec. 19992 555 inlägg
Frågan#1

Är ingen hejare på C++ men nu tvingas jag jobba med det ändå eftersom jag behöver koppla C++-API:er till min applikation.

Har satt upp ett projekt med "managed" C++ i VS, och håller på med att rita upp ett .NET Windows-formulär (System::Windows::Forms).

Fungerar bra, men det är en sak jag retar mig på. När jag fyller en GroupBox så förväntar sig metoden Controls->AddRange en vektor med pekare på Control-object. Går att göra såhär:

Control __gc* myCtrl[] = {static_cast<Control*> (this->myButton), static_cast<Control*> (this->myTextBox)};
this->myGroupBox->Controls->AddRange(myCtrl);

Men jag vill kunna göra detta i en rad. Utan att behöva gå via myCtrl. Borde väl gå, eller?

Medlem sedan maj 20021 466 inlägg
#2

Det går inte, vad jag vet. Du skulle dock kunna skapa vektorn i en egen funktion och returnera den. Det ger dig ingen möjlighet att frigöra vektorn, men eftersom du använder garbage collection kan det fungera.

Ungefär så här:
this->myGroupBox->Controls->AddRange(CreateRange(...));

Medlem sedan dec. 19992 555 inlägg
#3

Får jag inte samma problem när jag skall skicka kontrollerna till funktionen (har flera GroupBox)? Det logiska är väl att skicka en vektor med pekare till funktionen, men då är jag tillbaka på ruta ett.

Inget stort problem. Det är bara perlkodaren i mig som retar sig på att behöva deklarera pekarnamn jag aldrig använder. :)

Går ju att skapa anonyma object. T.ex.

this->myButton->add_Click(new EventHandler(this, &myClass::myButton_Click));

Tänkte om det gick att göra något liknande med vektorer.

Men du har säkerligen rätt. Har provat alla alternativ jag kan komma på, och kompilatorn klagar hela tiden.

Medlem sedan aug. 2001458 inlägg
#4

Jag lyckades inte heller med detta. Det går utmärkt från C# så frågan är om det är en begränsning i managed c++ eller om vi bara inte förstår hur man gör. Du kan ju prova att fråga på news://msnews.microsoft.com/microsoft.public.dotnet.languages.vc

Även om du behöver en temporär pekare, optimeras den med största säkerhet bort redan vid kompileringen, så prestandamässigt är det ingen skillnad.

286 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
137 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
144 ms — ändringar (db)