Avatar billede gargantua Nybegynder
28. maj 2004 - 19:01 Der er 7 kommentarer

Brug af templates i klasser C++

Kan man anvende templates inde i en klasseerklæring/-implementering?
Har siddet og fedtet med flg. kode:

#include <iostream.h>

class Find
{
private:
    int antal;
public:
    Find(): antal(0){}
    int findIndex(T arr[], int n, long konto_nr);
};

template <class T>
int Find::findIndex(T arr[], int n, long konto_nr)
{
int index=0;
while(konto_nr!=arr[index] && (index < n))
{ index++; }
if(index==n) {return -1;}
else {return index;}
}

const int MAX_ANTAL_KONTI=5;

int main()
{
    int konti[MAX_ANTAL_KONTI]={4,54,465,4,9};
    Find obj;
    //find plads af 54
    cout << "Index plads er ";
        cout << obj.findIndex(konti, 5,54) << endl;
    return 0;
}
Avatar billede bertelbrander Novice
28. maj 2004 - 20:52 #1
#include <iostream>

template <typename T> class Find
{
private:
    int antal;
public:
    Find(): antal(0){}
    int findIndex(T arr[], int n, long konto_nr);
};

class Find2
{
private:
    int antal;
public:
  Find2(): antal(0){}
  template <typename T> int findIndex(T arr[], int n, long konto_nr);
};

template <typename T> int Find<T>::findIndex(T arr[], int n, long konto_nr)
{
  int index=0;
  while(konto_nr!=arr[index] && (index < n))
  {
    index++;
  }
  if(index == n)
  {
    return -1;
  }
  else
  {
    return index;
  }
}

template<typename T> int Find2::findIndex(T arr[], int n, long konto_nr)
{
  int index=0;
  while(konto_nr!=arr[index] && (index < n))
  {
    index++;
  }
  if(index == n)
  {
    return -1;
  }
  else
  {
    return index;
  }
}

const int MAX_ANTAL_KONTI = 5;

int main()
{
    int konti[MAX_ANTAL_KONTI]={4,54,465,4,9};
    Find<int> obj;
    std::cout << "Index plads er ";
    std::cout << obj.findIndex(konti, 5, 54) << std::endl;

    Find2 Obj2;
    std::cout << "Index er: " << Obj2.findIndex<int>(konti, 5, 465) << std::endl;
    return 0;
}
Avatar billede gargantua Nybegynder
29. maj 2004 - 10:10 #2
Takker igen,
kan dog ikke få Find2 løsningen til at fungere i min compiler (VS6), men find1 fungerer fint.

Hilsen
G
Avatar billede gargantua Nybegynder
29. maj 2004 - 13:16 #3
Kan du hjælpe med endnu et problem?

Jeg har 4 arrays med 4 forskellige objekter. Alle objekter har dog disse attributter til fælles: kunde_nr og saldo.
Hver kunde kan godt have oprettet flere objekter med tilhørende saldoer (saldi?).

Nu vil jeg gerne lave en søgealgoritme som gennemløber alle arrays og lægger saldoerne sammen for hver kunde og tester om beløbet er større end fx. 20000.
Hvis det er det, skal kunden udskrives.

Hvordan løses det problem mest elegant? Kunne rekursion være en mulighed?
Hilsen
G
Avatar billede bertelbrander Novice
29. maj 2004 - 14:26 #4
Visual C++ 6.0 har det ikke for godt med de lidt mere specielle C++ features.

En hurtig løsning på dit andet problem kunne se sådan ud:

<code>
#include <iostream>
#include <vector>

class Base
{
public:
  Base(int k, double s) : Kunde(k), Saldo(s)
  {
  }
  int    Kunde;
  double Saldo;
};


class Sub1 : public Base
{
public:
  Sub1(int k, double s) : Base(k, s)
  {}
};

class Sub2 : public Base
{
public:
  Sub2(int k, double s) : Base(k, s)
  {}
};
class Sub3 : public Base
{
public:
  Sub3(int k, double s) : Base(k, s)
  {}

};
class Sub4 : public Base
{
public:
  Sub4(int k, double s) : Base(k, s)
  {}
};

int main()
{
  std::vector<Sub1> S1;
  std::vector<Sub2> S2;
  std::vector<Sub3> S3;
  std::vector<Sub4> S4;

  S1.push_back(Sub1(0, 12.12));
  S1.push_back(Sub1(1, 23.23));
  S1.push_back(Sub1(2, 44.44));
  S1.push_back(Sub1(0, 44.44));

  S2.push_back(Sub2(0, 52.12));
  S2.push_back(Sub2(1, 63.23));
  S2.push_back(Sub2(2, 74.44));
  S2.push_back(Sub2(0, 84.44));

  S3.push_back(Sub3(0, 72.12));
  S3.push_back(Sub3(1, 73.23));
  S3.push_back(Sub3(2, 74.44));
  S3.push_back(Sub3(0, 47.44));

  S4.push_back(Sub4(0, 92.12));
  S4.push_back(Sub4(1, 93.23));
  S4.push_back(Sub4(2, 94.44));
  S4.push_back(Sub4(0, 97.44));

  std::vector<Base>::iterator idx;

  for(int i = 0; i < 3; i++)
  {
    double sum = 0;
    for(idx = S1.begin(); idx != S1.end(); idx++)
      if(idx->Kunde == i)
        sum += idx->Saldo;
    for(idx = S2.begin(); idx != S2.end(); idx++)
      if(idx->Kunde == i)
        sum += idx->Saldo;
    for(idx = S3.begin(); idx != S3.end(); idx++)
      if(idx->Kunde == i)
        sum += idx->Saldo;
    for(idx = S4.begin(); idx != S4.end(); idx++)
      if(idx->Kunde == i)
        sum += idx->Saldo;
    std::cout << "Kunde: " << i << ", Saldo: " << sum << std::endl;
  }
}

</code>
Jeg har brugt en std::vector, i stedet for et array.
Jeg er ikke sikker på jeg forstår hvorfor du vil have 4 arrays, og ikke blot et.
Avatar billede gargantua Nybegynder
29. maj 2004 - 14:52 #5
Tak for løsningen. Desværre er jeg stadig nybegynder i C++ så jeg er ikke nået til vectorer endnu. Du har vel ikke en mere simpel løsning?

Grunden til objekterne skal opbevares i 4 forskellige arrays, er at det drejer sig om forskellige kontoformer der må separeres.

Hilsen
G
Avatar billede bertelbrander Novice
29. maj 2004 - 16:31 #6
Stort set det samme blot med et 2 Array:

<code>
#include <iostream>

class Base
{
public:
  Base(int k, double s) : Kunde(k), Saldo(s)
  {
  }
  int    Kunde;
  double Saldo;
};


class Sub1 : public Base
{
public:
  Sub1(int k, double s) : Base(k, s)
  {}
};

class Sub2 : public Base
{
public:
  Sub2(int k, double s) : Base(k, s)
  {}
};
class Sub3 : public Base
{
public:
  Sub3(int k, double s) : Base(k, s)
  {}

};
class Sub4 : public Base
{
public:
  Sub4(int k, double s) : Base(k, s)
  {}
};

int main()
{
  Base *Ar[4][5];

  Ar[0][0] = new Sub1(0, 11.12);
  Ar[0][1] = new Sub1(0, 12.12);
  Ar[0][2] = new Sub1(1, 23.23);
  Ar[0][3] = new Sub1(2, 44.44);
  Ar[0][4] = new Sub1(0, 44.44);

  Ar[1][0] = new Sub2(0,  2.12);
  Ar[1][1] = new Sub2(0, 52.12);
  Ar[1][2] = new Sub2(1, 63.23);
  Ar[1][3] = new Sub2(2, 74.44);
  Ar[1][4] = new Sub2(0, 84.44);

  Ar[2][0] = new Sub3(0,  2.12);
  Ar[2][1] = new Sub3(0, 72.12);
  Ar[2][2] = new Sub3(1, 73.23);
  Ar[2][3] = new Sub3(2, 74.44);
  Ar[2][4] = new Sub3(0, 47.44);

  Ar[3][0] = new Sub4(0,  2.12);
  Ar[3][1] = new Sub4(0, 92.12);
  Ar[3][2] = new Sub4(1, 93.23);
  Ar[3][3] = new Sub4(2, 94.44);
  Ar[3][4] = new Sub4(0, 97.44);

  for(int i = 0; i < 3; i++) // For each user
  {
    double sum = 0;
    for(int a = 0; a < 4; a++)  // For each type
    {
      for(int b = 0; b < 5; b++)  // For each elemet in the array
      {
        if(Ar[a][b]->Kunde == i)
          sum += Ar[a][b]->Saldo;
      }
    }
    std::cout << "Kunde: " << i << ", Saldo: " << sum << std::endl;
  }
  for(int a = 0; a < 4; a++)  // For each type
    for(int b = 0; b < 5; b++)  // For each elemet in the array
      delete Ar[a][b];
}
</code>
Avatar billede gargantua Nybegynder
30. maj 2004 - 12:34 #7
Okay, jeg arbejder med det. Tak for din løsning
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