deklaracja dynamicznej tablicy dwuwymiarowej w klasie

0

c++/ c++ builder 6

witam, mam nastepujacy program :

 
#include <vcl.h>
#include <locale>
#include <iomanip>
#include <locale>
#include <conio.h>
#include <iostream>
#pragma hdrstop
#pragma argsused
using namespace std;

class a
{
public:

int w,k;
int **tablica = new int * [w];
      for (int c=0; c<w; c++)
      { tablica[c] = new int[w]; }



      void wyzerowanie() { for (int i=0; i<w;i++) { for (int j=0;j<w;j++)   tablica[i][j]=0;  } }

      void wypisanie()   {
             for (int a=0; a<w; a++)
                  { for (int b=0;b<w; b++)
                         {  cout<<tablica[a][b]<<"    ";
                         }cout<<endl;
                  }
                         }

       void glowny()
        {
         int i;
         cout<<"Wybierz "<<endl;
         cin>>i;
         switch(i)
          { case 1: wyzerowanie(); break;
            case 2: wypisanie(); break;
            case 3: wyzerowanie();wypisanie(); break;
          }
};


int main(int argc, char* argv[])
{
        a *engine = new a();
        engine->glowny();

        getch();
        return 0;
}

problem polega na tym, ze wywala bład przy deklaracji tablicy dwuwymiarowej:

[C++ Error] Unit1.cpp(16): E2233 Cannot initialize a class member here

prosze o pomoc

0

Poczytaj o konstruktorach. C/C++ to nie PHP tak nie da rady tego użyć.

1

umieść inicjalizację w konstruktorze.

...
int **tablica;
a()
{
   tablica = new int * [w];
   for (int c=0; c<w; c++)
      tablica[c] = new int[w];
}
...

popraw wcięcia. teraz masz burdel i nie zgadzają się klamry.

potrzebny jest też destruktor.

~a()
{
   for (int c=0; c<w; c++)
      delete[] tablica[c];
   delete[] tablica;
}

i jego wywołanie pod koniec programu:

delete engine;
0

poprawiłem:

#include <vcl.h>
#include <locale>
#include <iomanip>
#include <locale>
#include <conio.h>
#include <iostream>
#pragma hdrstop
#pragma argsused
using namespace std;

class a
{
public:
int w,k;

int **tablica;
a()
   {
     tablica = new int * [w];
     for (int c=0; c<w; c++)
          tablica[c] = new int[w];
   }

~a()
    {
      for (int c=0; c<w; c++)
      delete[] tablica[c];
          delete[] tablica;
    }



      void wyzerowanie() { for (int i=0; i<w;i++) { for (int j=0;j<w;j++)   tablica[i][j]=0;  } }

      void wypisanie()   
      {
             for (int a=0; a<w; a++)
                  { 
                      for (int b=0;b<w; b++)
                         {  
                             cout<<tablica[a][b]<<"    ";
                         }
                         cout<<endl;
                  }
      }

       void glowny()
        {
         int i;
         cout<<"Wybierz "<<endl;
         cin>>i;
                 switch(i)
                 { 
                          case 1: wyzerowanie(); break;
                          case 2: wypisanie(); break;
                          case 3: wyzerowanie();wypisanie(); break;
                 }
        }
};


int main(int argc, char* argv[])
{
        a *engine = new a();
        engine->glowny();
        
        delete engine;
        getch();
        return 0;
}

 

kopilacja przechodzi ale gdy program sie uruchomi wyrzuca jakis bład :/

0

To se sprawdź debuggerem w której linijce. Nie jest to trudne

1

Tak na logikę, to pola w oraz k są niezainicjowane podczas wywoływania konstruktora...

Btw.

wyrzuca jakis bład

user image

0

mega prośba, mógłby mi to ktoś poprawic ?? plis

0

Konstruktor ma po prostu przyjmować dwie wartości i przypisywać je do pól klasy; jeżeli Cię to przerasta, to nie wiem jak dotychczas napisałeś ten kod.

0
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
 
class Tablica
  {
   private:
   size_t W,K;
   int *tablica;
   public:
   Tablica(size_t W,size_t K):W(W),K(K),tablica(new int[W*K]) { losowanie(); }
   ~Tablica() { if(W&&K) delete[] tablica; }
   void wyzerowanie() { memset(tablica,0,W*K*sizeof(int)); }
   void losowanie()
     {
      for(size_t w=0;w<W;++w)
        {
         for(size_t k=0;k<K;++k) tablica[w*K+k]=rand()%10;
        }
     }
   void wypisanie()   
     {
      for(size_t w=0;w<W;++w,cout<<endl)
        {
         for(size_t k=0;k<K;++k) cout<<("\t"+!k)<<tablica[w*K+k];
        }
     }
  }; 
 
int main()
  {
   Tablica engine(3,5);
 
   engine.wypisanie();
   while(true)
     {
      cout<<endl;
      cout<<"1. Zerowanie"<<endl;
      cout<<"2. Losowania"<<endl;
      cout<<"0. Koniec"<<endl;
      cout<<"Wybierz: ";
      int i;
      if(cin>>i)
        {
         switch(i)
           { 
            case 1: engine.wyzerowanie(); engine.wypisanie(); break;
            case 2: engine.losowanie(); engine.wypisanie(); break;
            case 0: return 0;
            default: cout<<"Nie ma takiej opcji"<<endl; break;
           }
        }
      else
        {
         cin.clear();
         cout<<"To nie jest liczba"<<endl;
        }
      cin.sync();
     }
   return 0;
  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1