Announcement

Collapse
No announcement yet.

Template

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Template

    Hallo, ich beschäftige mich gerade mit Template und habe folgendes Problem.
    Ich habe mir eine Template geschaffen 'AllesSpeicher' in dem ich über SetzeWert(T1)
    einen Template-Wert speichere.
    Dann habe ich mir ein Template 'Regal' programmiert, welches zwei Template-Werte
    über SetzeWert1(T1) bzw. SetzeWert2(T2) speichert. Funktioniert auch mit Standard-Variablen
    wie int,double usw...

    Wie bekomme ich es hin, das ich ein 'AllesSpeicher' in ein Regal ablegen kann?

    Grüße aus Edemissen Mirko



    Source:

    template.h

    template < class T >
    class AllesSpeicher
    {
    private:
    T Wert;
    public:
    void SetzeWert(T);
    };

    template < class T1, class T2 >
    class Regal
    {
    private:
    T1 Wert1;
    T2 Wert2;
    public:
    void SetzeWert1(T1);
    void SetzeWert2(T2);
    };

    #include <iostream>

    using namespace std;

    // ALLES SPEICHER

    template < class T >
    void AllesSpeicher<T>::SetzeWert(T twert)
    {
    Wert = twert;
    cout << "Wert ist " << Wert<< endl;
    }



    // REGAL

    template < class T1, class T2 >
    void Regal<T1,T2>::SetzeWert1(T1 twert)
    {

    Wert1 = twert;
    cout << "Wert1 ist " << Wert1 << endl;
    }

    template < class T1, class T2 >
    void Regal<T1,T2>::SetzeWert2(T2 twert)
    {

    Wert2 = twert;
    cout << "Wert2 ist " << Wert2 << endl;
    }


    main.c


    #include <iostream>
    #include "templates.h"
    using namespace std;

    int main()
    {
    AllesSpeicher<int> as;
    as.SetzeWert(1);

    Regal<double, char> r;
    r.SetzeWert1(0.4);
    r.SetzeWert2('1');

    Regal<AllesSpeicher<int>, double> r2;
    r2.SetzeWert2(0.3);
    r2.SetzeWert1(as);

    return 0;
    }

  • #2
    Hallo,

    Ich würd dir 2 Tipps geben:
    1. Gebe einer Klasse nicht den Namen 'AllesSpeicher' das hört sich falsch an und verwirrt musst dreimal drüber
    lesen um nicht von diesem Namen abgelenkt zu werden! Nenn die Klasse einfach Speicher oder Memory.

    2. Warum benutzt du deine Klasse "AllesSpeicher" nicht einfach in der Klasse Regal? So musst du ja sonst die gleiche funktionalität
    2 mal implementieren! Das ist unnötige Arbeit!

    Comment


    • #3
      Ausgabe-Operator

      Hallo Offensiv,

      das Probelm ist die Ausgabe
      Code:
      ...
      cout << "Wert ist ...
      ...
      in den SetzeWert*-Funktionen. Der Ausgabe-Operator "<<" kennt die Klasse "AllesSpeicher<int>" nicht und der Compiler sollte eine entsprechende Fehlermeldung ausgeben:
      Code:
      ...error: no match for 'operator<<' in 'std::operator<< ...
      Das folgende, nicht besonders sinvolle Programm, lässt sich ohne Probleme kompilieren:
      Code:
      // x.cpp
      
      template< typename Type >
      class OneValue{
      private:
          Type _val;
      public:
          void setVal( const Type &v ){ _val = v; }
      };
      
      template< typename Type1, typename Type2 >
      class TwoValues{
      private:
          Type1 _val1;
          Type2 _val2;
      public:
          void setVal1( const Type1 &v ){ _val1 = v; }
          void setVal2( const Type2 &v ){ _val2 = v; }
      };
      
      int main( int argc, char *argv[] ){
          OneValue<int>                  one;
          TwoValues<OneValue<int>, char> two;
          one.setVal(42);
          two.setVal1(one);
          two.setVal2('x');
      
          return 0;
      }
      Siegfried

      Comment

      Working...
      X