开发者

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

开发者 https://www.devze.com 2023-02-17 12:39 出处:网络
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'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;
    }

    // Ret开发者_如何转开发urn 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!


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;
}


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!


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...)

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号