Avatar billede ahara Nybegynder
12. november 2004 - 22:00 Der er 18 kommentarer og
1 løsning

Array af objekter

Nogen der kan vise mig hvad jeg gør galt?

class xy
{
private:
    int hej;
public:
    xy(int hej_x){hej=hej_x;}
};

int main()
{
    xy *nr = new xy[10];
   
    return 0;
}

Fejlen jeg får er:

no appropriate default constructor available

Mvh
AHR
Avatar billede arne_v Ekspert
12. november 2004 - 22:03 #1
Den mangler en constructor uden argumenter.
Avatar billede ahara Nybegynder
12. november 2004 - 22:04 #2
Jep. Men hvorfor?
Avatar billede arne_v Ekspert
12. november 2004 - 22:04 #3
class xy
{
private:
    int hej;
public:
    xy() { };  // <------
    xy(int hej_x){hej=hej_x;};
};
Avatar billede arne_v Ekspert
12. november 2004 - 22:05 #4
new xy[10]

laver 10 styks xy'er !

Når den skal lave dem skal den bruge en constructor.

Og da den ikke har noget argument skal den bruge en uden argument.
Avatar billede arne_v Ekspert
12. november 2004 - 22:08 #5
Du mener nok i virkeligheden:

    xy **nr = new (xy *)[10];
    for(int i=0;i<10;i++) nr[i] = new xy(123);

og så behøver du ikke en constructor uden argumenter.
Avatar billede ahara Nybegynder
12. november 2004 - 22:08 #6
Hvis jeg så ønsker et 2-dimensionelt array. Hvad gør jeg så?

felt *nr = new felt[1][1];

virker ikke
Avatar billede arne_v Ekspert
12. november 2004 - 22:13 #7
græder

:-)

se nedenstående eksempel for gode ideer.
Avatar billede arne_v Ekspert
12. november 2004 - 22:13 #8
#include <iostream>
#include <vector>

using namespace std;

int main()
{
  // 2 D array
  int a1[3][3];
  for(int i=0;i<3;i++) for(int j=0;j<3;j++) a1[i][j]=i*3+j+1;
  int *x1;
  x1 = a1[1];
  for(int i=0;i<3;i++) cout << " " << x1[i];
  cout << endl;
  // array af arrays
  int **a2 = new (int *)[3];
  for(int i=0;i<3;i++) a2[i]=new int[3];
  for(int i=0;i<3;i++) for(int j=0;j<3;j++) a2[i][j]=i*3+j+1;
  int *x2;
  x2 = a2[1];
  for(int i=0;i<3;i++) cout << " " << x2[i];
  cout << endl;
  // vector af vector
  vector< vector<int> > a3;
  vector<int> v[3];
  for(int i=0;i<3;i++)
  {
      for(int j=0;j<3;j++) v[i].push_back(i*3+j+1);
      a3.push_back(v[i]);
  }
  vector<int> x3 = a3[1];
  for(int i=0;i<3;i++) cout << " " << x3[i];
  cout << endl;
  return 0;
}
Avatar billede arne_v Ekspert
12. november 2004 - 22:14 #9
#include <iostream>

using namespace std;

void init1(int *a,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) a[i*m+j]=1;
  return;
}

void show1(int *a,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << a[i*m+j];
      cout << endl;
  }
  return;
}

void init2(int **b,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) b[i][j]=2;
  return;
}

void show2(int **b,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << b[i][j];
      cout << endl;
  }
  return;
}

typedef int twodim[][3]; // <-------- fixed second dimension

void init3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) for(int j=0; j<m; j++) c[i][j]=3;
  return;
}

void show3(twodim c,int n,int m)
{
  for(int i=0; i<n; i++) {
      for(int j=0; j<m; j++) cout << " " << c[i][j];
      cout << endl;
  }
  return;
}

int main()
{
  int n = 2;
  int m = 3;
  int *a = new int[n*m];
  init1(a,n,m);
  show1(a,n,m);
  int **b = new (int *)[n];
  for(int i=0; i<n; i++) b[i]=new int[m];
  init2(b,n,m);
  show2(b,n,m);
  twodim *c = new twodim[2];
  init3(*c,n,m);
  show3(*c,n,m);
}
Avatar billede arne_v Ekspert
12. november 2004 - 22:15 #10
Det er nemt at lave et staisk 2D array.

Men dynamisk må du vælge:
- simulere 2D i 1D
- array af arrays
- vector af vector
Avatar billede ahara Nybegynder
12. november 2004 - 22:27 #11
Det jeg mente var, at du sagde jeg kunne gøre følgende. Ved godt det er med en tom konstruktør.

class xy
{
private:
    int hej;
public:
    xy(){}
    xy(int hej_x){hej=hej_x;}
};

int main()
{
    xy *nr = new xy[10];
   
    return 0;
}

Men hvorfor kan jeg så ikke gøre det til et 2D array?

class xy
{
private:
    int hej;
public:
    xy(){}
    xy(int hej_x){hej=hej_x;}
};

int main()
{
    xy *nr = new xy[10][10];
   
    return 0;
}
Avatar billede arne_v Ekspert
12. november 2004 - 22:30 #12
Det kan man bare ikke i C++.

Du kan sagtens i C# og Java.

Men C++ er altså anderledes.

(rent teknisk er der også nogle problemer med at få typer på højre og venstre side
til at passe)
Avatar billede ahara Nybegynder
12. november 2004 - 23:05 #13
Vil det sige at hvis jeg skulle lave det på "din" måde, skulle jeg benytte 2 for-løkker. En til index af rækker og en til index a kolonner? Altså hvis jeg skal benytte et 2D array
Avatar billede arne_v Ekspert
12. november 2004 - 23:09 #14
Hvis du skal lave noget 2D skal du vel under alle omstændigheder have 2 for løkker
uanset om det er: ægte 2D array, array af arrays, simuleret 2D Array i 1D array,
eller vector af vector
Avatar billede ahara Nybegynder
12. november 2004 - 23:12 #15
Du har hjulet meget. Har fundet en løsning nu. Mange tak for hjælpen :-)
Avatar billede arne_v Ekspert
12. november 2004 - 23:14 #16
så ligger jeg et svar
Avatar billede erikjacobsen Ekspert
13. november 2004 - 00:10 #17
En meget lille præcisering omkring det oprindelige spørgsmål: Når man erklærer
objekter eller arrays af objekter skal der kaldes en constructor. I

xy *nr = new xy[10];

kan det kun være default constructor, da der ikke er parametre med, som arnev siger.
Men en anden løsning, end blot at definere en default constructor, kan også være
at sætte parametre på, så en anden constructor kaldes, fx

xy *nr = new xy[10](0);

Den constructor du har, xy(int hej_x){hej=hej_x;}, vil så blive kaldt med
parametren 0 for alle de 10 objekter i arrayet.
Avatar billede ahara Nybegynder
13. november 2004 - 00:26 #18
Tak begge. Her er hvad jeg ville lige fra starten. Men det er da muligt at koden ikke er optimal eller?

class xy
{
private:
int hej1;
int hej2;
public:
xy(){}
xy(int hej1_x,int hej2_x)
{
  hej1=hej1_x;
  hej2=hej2_x;
}
};

int main()
{
xy *nr[2][2];

nr[0][0]=new xy(1,2);
  //Her skal så de andre objekter oprettes i arrayet

return 0;
}
Avatar billede erikjacobsen Ekspert
13. november 2004 - 00:42 #19
Du kan også

xy nr[2][2] = { { xy(1,2), xy(7,8) },{ xy(11,10), xy(12,14) } };

;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester