michael
michael

Reputation: 15282

C++: How would one implement their own String class?

I'm trying to re-learn C++ and was wondering if anyone could help me out here. I'm trying to implement my own String class to see if I can remember things, but I'm stuck on the constructor.

I have my header file and want to have a constructor as so:

Header File (MyFiles\String.h):

#ifndef STRING_
#define STRING_

using namespace std;
#include <iostream>

class String
{
  private:

    static const unsigned int MAX = 32;    // Capacity of string

    char Mem[MAX];    // Memory to hold characters in string
    unsigned Len;     // Number of characters in string

  public:

    // Construct empty string
    //
    String()
    {
      Len = 0;
    }

    // Reset string to empty
    //
    void reset()
    {
      Len = 0;
    }

    // Return status information
    //
    bool empty() const
    {
      return Len == 0;
    }

    unsigned length() const
    {
      return Len;
    }

    // Return reference to element I
    //
    char& operator[]( unsigned I )
    {
      return Mem[I];
    }

    // Return constant reference to element I
    //
    const char& operator[]( unsigned I ) const
    {
      return Mem[I];
    }

    // Construct string by copying existing string
    //
    String( const String& );

    // Construct string by copying array of characters
    //
    String( const char [] );

    // Copy string to the current string
    //
    String& operator=( const String& );

    // Append string to the current string
    //
    String& operator+=( const String& );
};

// Compare two strings
//
bool operator==( const String&, const String& );
bool operator!=( const String&, const String& );

// Put a string into an output stream
//
ostream& operator<<( ostream&, const String& );

#endif

The bit I'm stuck on is this:

String::String(const String& str)
{
    //what goes here?
}

Thanks!

Upvotes: 1

Views: 2540

Answers (3)

hookenz
hookenz

Reputation: 38897

Well, since it's a learning exercise.

I think you want to copy the contents of the other string here since this is a copy constructor. So you will want to copy across all the member variables. In your case the copy constructor is not necessary because you've got a static array. If you had dynamic memory (i.e. used new to allocate pointer to Mem) then you'd need this. However, to show you how it's done, here you go.

String::String(const String& str)
{
    //what goes here?
    assert(str.Len < MAX);  // Hope this doesn't happen.
    memcpy(Mem, str.Mem, str.Len);
    Len = str.Len;
}

Upvotes: 2

Gareth McCaughan
Gareth McCaughan

Reputation: 19971

I concur with Kornel Kisielewicz: the fewer hand-rolled String classes, the better. But you're only doing this to learn, so fair enough :-). Anyway: your copy constructor needs to copy over the length and the contents of the Mem array, and that's it.

(If you were doing this to make something useful rather than as a learning exercise, I'd add: a string class with a fixed maximum string length -- especially one as small as 32 characters -- is a very bad idea indeed. But it's entirely reasonable if you don't feel like dealing with memory allocation and deallocation at the same time as you're trying to remember the even-more-basics...)

Upvotes: 0

Robᵩ
Robᵩ

Reputation: 168626

You need to copy the data from str to this. The length is easy:

Len = str.Len; // or, equiv. this->Len= str.Len

The data is a little harder. You might use strcpy or memcpy, or even a for loop.

memcpy(Mem, str.Mem, sizeof Mem);

Good luck!

Upvotes: 1

Related Questions