Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Konstruktor erst später ausführen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
03.06.2006, 12:13 Uhr
Karldin Shinowa
Professional Noob


Hätte ein Problem. ich Deklariere ein array von objekten. die anfangswerte werden allerdings nicht sofort festgelegt sondern erst in einer Schleife:

C++:

   Button Buttons[9];//9 Buttons erschaffen

   int index=0;
   short value=1;
   int x=10;
   int y=10;
   int w=50;
   int h=50;
  
   for(int i=1;i=<3;i++)
   {
      for(int j=1;i<=3;j++)
      {
         Buttons[index](value,toString(value),x,y,w,h,MyWindow);//mim Konstruktor initialisiert
         value++;
         index++;
         x+=60;
      }
      x=10;
      y+=60;
   }



Klar dass er das nicht will da ja oben für alle 9 Buttons Button() aufgerufen wird. trotzdem kann ich das irgendwie umgehen?

habs dann mal mit nem vector probiert: und fehler bekommen

C++:
std::vector<Button> Buttons;

   int index=0;
   short value=1;
   int x=10;
   int y=10;
   int w=50;
   int h=50;
  
   for(int i=1;i=<3;i++)//expected primary expression before '('
   {
      for(int j=1;i<=3;j++)
      {
         Buttons.push_back(Button(value,toString(value),x,y,w,h,MyWindow));
         value++;
         index++;
         x+=60;
      }
      x=10;
      y+=60;
   }



Stimmt das mal so vom denken her? hab noch andere fehler aber die sind qt-spezifisch
--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.

Dieser Post wurde am 03.06.2006 um 12:13 Uhr von Karldin Shinowa editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
03.06.2006, 12:18 Uhr
kronos
Quotenfisch
(Operator)


Was den array betrifft - für solche Fälle gibt es pointer.
Der Fehler hat seine Ursache wohl in der Syntax weiter oben. (Klamme vergessen oder so)
Ansonsten sieht's gut aus...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 03.06.2006 um 12:19 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
03.06.2006, 12:44 Uhr
Karldin Shinowa
Professional Noob



Zitat von kronos:

Was den array betrifft - für solche Fälle gibt es pointer.


Wien meinst du das?
so?:

C++:

   Button*Buttons[9];

   int index=0;
   short value=1;
   int x=10;
   int y=10;
   int w=50;
   int h=50;
  
   for(int i=1;i=<3;i++)
   {
      for(int j=1;i<=3;j++)
      {
         Button MyButton(value,toString(value),x,y,w,h,MyWindow);
         Buttons[index]=&MyButton;
        
         value++;
         index++;
         x+=60;
      }
      x=10;
      y+=60;
   }




Zitat von kronos:

Der Fehler hat seine Ursache wohl in der Syntax weiter oben. (Klamme vergessen oder so)
Ansonsten sieht's gut aus...



hmm finde keinen Fehler

C++:
#include<QApplication>
#include<QWidget>
#include"Button.h"
#include<string>
#include<sstream>
#include<vector>

std::string toString(int nr)//thx at Windalf
{
    std::stringstream ss;
    ss << nr;
    return ss.str();
}

int main(int argc,char*argv[])
{
   QApplication *app=new QApplication(argc,argv);
  
   QWidget* MyWindow=new QWidget;
   MyWindow->setFixedSize(190,400);
  

   std::vector<Button> Buttons;

   int index=0;
   short value=1;
   int x=10;
   int y=10;
   int w=50;
   int h=50;
  
   for(int i=1;i=<3;i++)
   {
      for(int j=1;i<=3;j++)
      {
         Button MyButton(value,toString(value),x,y,w,h,MyWindow);
         Buttons.push_back(MyButton);
        
         value++;
         index++;
         x+=60;
      }
      x=10;
      y+=60;
   }
        
   MyWindow->show();


   return app->exec();
}


--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
03.06.2006, 13:59 Uhr
ao

(Operator)



Zitat von Karldin Shinowa:
Klar dass er das nicht will da ja oben für alle 9 Buttons Button() aufgerufen wird. trotzdem kann ich das irgendwie umgehen?

Mit C-Arrays nicht. Du hast gerade selber gemerkt, warum die als Objektcontainer in C++ ungeeignet sind. Verwende passende C++-Klassen, dann wirst du glücklich.

Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
03.06.2006, 14:27 Uhr
Karldin Shinowa
Professional Noob


mit den pointern müsste das jetzt funtzen . habe aber immer noch dieses prob

C++:
for(int i=1;i=<3;i++)//<----expected primary expression before '('
   {
      for(int j=1;i<=3;j++)
      {
         Buttons.push_back(Button(value,toString(value),x,y,w,h,MyWindow));
         value++;
         index++;
         x+=60;
      }
      x=10;
      y+=60;
   }


--
Ich will die Welt verbessern, doch Gott gibt mir nicht den Code.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
03.06.2006, 15:00 Uhr
(un)wissender
Niveauwart


i=<3 gibt es nicht. Meinst du i<=3?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
03.06.2006, 15:07 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von ao:

Zitat:
Klar dass er das nicht will da ja oben für alle 9 Buttons Button() aufgerufen wird. trotzdem kann ich das irgendwie umgehen?

Mit C-Arrays nicht. Du hast gerade selber gemerkt, warum die als Objektcontainer in C++ ungeeignet sind. Verwende passende C++-Klassen, dann wirst du glücklich.

Gruß,
ao


Hi das geht schon,allerdings muss ich dir Recht geben dass ein geeigneter Container hier angezeigt wäre.Mal abgesehen davon stellt sich mir die Frage ob dieser ganze Buttonerzeugungskram nicht ohnehin eher in den Konstruktor des Parent Widgets gehören würde(welcher dann seine Childs ohnehin selber verwaltet).
Dann ist noch zu klären ob der "sinnlose" Aufruf des Standardkonstruktors bei 9 Elementen wirklich so brutal zu bewerten ist.
Es besteht dann ja auch im Nachhinein noch die Möglichkeit einer Zuweisung eines temporären Objekts oder, sofern setter vorhanden sind ,dem Objekt so die "richtigen" Werte zuzuweisen.
Wenn denn aber der Standardkonstruktor partout nicht aufgerufen werden darf(oder es einfach keinen gibt?) gibt es noch die Geschichte mit dem Placement new.
Damit könnte man nen Array erstellen ohne das der Konstruktor behelligt wird.


C++:
#include <new>
#include <iostream>

class foo
{
    int x;
    int y;
    double d;
public:
    foo(int x_ =0,int y_=0,double d_=0):x(x_),y(y_),d(d_){}
    void out()
    {
        std::cout<<x<<'\t'<<y<<'\t'<<d<<std::endl;
    }
};

int main(int argc, char *argv[])
{
    //Mit Placement new
    foo* f= (foo*)malloc(sizeof(foo)*10);
    for(int i=0;i<10;++i)
        new(f+i) foo(i,i+3,i/3.14);

    for(int i=0;i<10;++i)
    {
        f[i].out();
        f[i].~foo();//Destruktor explizit aufrufen!
    }
    free(f);//Speicher wieder freigeben

    //stinknormale nachträgliche Zuweisung
    foo f2[10];
    for(int i=0;i<10;++i)
        f2[i]= foo(i,i+2,i/0.5);

    for(int i=0;i<10;++i)
        f2[i].out();

    return 0;
}



Gruss Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: