Home c++ template classes in different files

template classes in different files [duplicate]

Author

Date

Category

wrote in the view the obolvenously working code, but it does not work (

Help!

main.cpp:

# include & lt; iostream & gt;
#Include & lt; String & GT;
#Include "Classes / Dinamic / Dinamic.h"
#Include "Classes / Person / Person.h"
Using Namespace STD;
#Define Return Return 0
INT MAIN ()
{
  SetLocale (LC_ALL, "RU");
  CIN.EXCEPTIONS (iOS :: FAILBIT | iOS :: Badbit);
  Dinamic & lt; String & GT; Texts_;
  Texts_.push_back ("Hi, you have a task");
  Texts_.push_back ("Share it and get a reward!");
  Person L ("Crocodile");
  L.Speak ("Hello");
  Return;
}

dinamic.cpp:

# include & lt; iostream & gt;
#Include & lt; String & GT;
#Include "dinamic.h"
Using Namespace STD;
    // Constructor.
  Template & lt; Class T & GT; Dinamic & LT; T & GT; :: Dinamic ()
  {
    SIZE_ = 0;
    __ARRAY = NEW T [SIZE_]; // CREATE EMPTY ARRAY
  }
    // Destructor
  TEMPLATE & LT; Class T & GT; Dinamic & LT; T & GT; :: ~ Dinamic ()
  {
    DELETE [] __ARRAY; // Clean Memory.
  }
    // Method Push Back
  TEMPLATE & LT; Class T & GT; Void Dinamic & LT; T & GT; :: PUSH_BACK (Const T & Amp; Value)
  {
    T * array_buffer = new t [(this- & gt; size _) + 1]; // CREATE NEW ARRAY
    for (int i = 0; i & lt; this- & gt; size_; i ++)
    {
      array_buffer [i] = __array [i];
    }
    array_buffer [this- & gt; size_] = value; // Add New Element
    Size _ ++;
    DELETE [] __ARRAY; // Clean Old Array
    __ARRAY = Array_Buffer; // Update Pointer.
  }
    // Method Print All Array
  TEMPLATE & LT; Class T & GT; Void Dinamic & LT; T & GT; :: Printallementinarray (Const String & Amp; Separation)
  {
    for (int i = 0; i & lt; this- & gt; size_; i ++)
    {
      if (i == (this- & gt; size_-1)) // if Final Iteration
      {
        cout & lt; & lt; __ array [i] & lt; & lt; endl;
        Break;
      }
      COUT & LT; & lt; __ array [i] & lt; & lt; separation;
    }
  }
    // Method Pop Back
  TEMPLATE & LT; Class T & GT; Void Dinamic & LT; T & GT; :: POP_BACK ()
  {
    Size _--;
    T * Array_Buffer = New T [this- & gt; size_];
    for (int i = 0; i & lt; this- & gt; size_; i ++)
    {
      array_buffer [i] = __array [i];
    }
    DELETE [] __ARRAY;
    __ARRAY = Array_Buffer;
  }
    // Return Element by Index
  TEMPLATE & LT; CLASS T & GT; T &M; DINAMIC & LT; T & GT; :: ElementByindex (Const Int & amp; index)
  {
    RETURN __ARRAY [INDEX];
  }
    // GET SIZE.
  TEMPLATE & LT; Class T & GT; int & amp; Dinamic & LT; T & GT; :: Size ()
  {
    RETURN SIZE_;
  }
    // Is Empty?
  TEMPLATE & LT; Class T & GT; BOOL DINAMIC & LT; T & GT; :: Empty ()
  {
    IF (this- & gt; size_ & gt; 0) {
      RETURN FALSE;
    }
    ELSE {
      RETURN TRUE;
    }
  }
    // Resize Array.
  TEMPLATE & LT; Class T & GT; Void Dinamic & LT; T & GT; :: Resize (Const Int & amp; New_Size, Const T & Amp; Values)
  {
    T * array_buffer = new t [new_size];
    for (int i = 0; i & lt; this- & gt; size_; i ++)
    {
      array_buffer [i] = __ array [i];
    }
    for (int i = (this- & gt; size_); i & lt; new_size; i ++)
    {
      array_buffer [i] = values;
    }
    this- & gt; size_ = new_size;
    DELETE [] __ARRAY;
    __ARRAY = Array_Buffer;
  }

dinamic.h:

# ifndef _is_guard_
#Define _is_guard_
#Include & lt; String & GT;
#Include & lt; iostream & gt;
Using Namespace STD;
TEMPLATE & LT; Class T & GT;
Class Dinamic
{
Public:
  Dinamic ();
  ~ Dinamic ();
  Void Push_back (Const T & AMP; Value);
  void printallementinarray (const string & amp; separation = "\ n");
  void pop_back ();
  T & amp; ElementByindex (Const int & amp; index);
  int & amp; Size ();
  BOOL EMPTY ();
  Void Resize (Const int & amp; new_size, const t & amp; values ​​= 0);
Private:
  int size_; // Size Array.
  T * __ARRAY; // Main Array.
};
#endif // _is_guard_

person.cpp:

# include & lt; iostream & gt;
#Include & lt; String & GT;
#Include "../dinamic/dinamic.h"
#Include "person.h"
Using Namespace STD;
Person :: Person (String Name)
{
  this- & gt; name = name;
}
Void Person :: Speak (Const String & Amp; Text)
{
  COUT & LT; & lt; Name & lt; & lt; ":" & lt; & lt; Text & lt; & lt; Endl;
}
TEMPLATE & LT; Class T & GT; Void Person :: Give_Quest (
                    Dinamic & lt; String & GT; * Texts,
                    Const String & Amp; Quest,
                    Const T & AMP; Answer.
                                  )
{
  For (int i = 0; i & lt; texts- & gt; size (); i ++)
  {
    COUT & LT; & LT; Texts- & gt; elementByindex (I) & lt; & lt; Endl;
  }
  COUT & LT; & LT; QUEST & LT; & lt; Endl;
  String Buffer;
  CIN & GT; & GT; Buffer;
  If (Buffer == To_String (Answer))
  {
    COUT & LT; & LT; "Right!" & lt; & lt; endl;
  }
  ELSE.
  {
    COUT & LT; & LT; "Invalid!" & lt; & lt; Endl;
  }
}

person.h:

# ifndef _is_guard_penson_
#Define _is_guard_person_
#Include & lt; iostream & gt;
#Include & lt; String & GT;
#Include "../dinamic/dinamic.h"
Using Namespace STD;
Class Person
{
Public:
    // Constructor.
  Person (String);
  Void Speak (Const String & Amp;);
  TEMPLATE & LT; Class T & GT; Void Give_Quest (Dinamic & LT; String & GT; *, Const String & Amp;, Const T & AMP;);
Private:
  String Name;
};
#endif // _ is_guard_person_

Compile through G ++ Such a command:

clear;
G ++ main.cpp Classes / Dinamic / Dinamic.cpp Classes / Person / Person.cpp -O Programm;
./Programm.

Project structure corresponds!

Error itself:


Answer 1, Authority 100%

You have a code describing the work of the template, should be in one broadcast unit. In other words, you need all the implementation of methods, etc. To transfer to the corresponding .h files.

Programmers, Start Your Engines!

Why spend time searching for the correct question and then entering your answer when you can find it in a second? That's what CompuTicket is all about! Here you'll find thousands of questions and answers from hundreds of computer languages.

Recent questions