C ++: Как реализовать собственный класс String? - PullRequest
2 голосов
/ 17 марта 2011

Я пытаюсь заново выучить C ++, и мне было интересно, может ли кто-нибудь помочь мне здесь.Я пытаюсь реализовать свой собственный класс String, чтобы проверить, могу ли я что-то вспомнить, но я застрял в конструкторе.

У меня есть заголовочный файл, и я хочу иметь конструктор следующим образом:

Заголовочный файл (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

Я застрял на следующем:

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

Спасибо!

Ответы [ 3 ]

3 голосов
/ 17 марта 2011

Ну, так как это учебное упражнение.

Я думаю, что вы хотите скопировать содержимое другой строки здесь, так как это конструктор копирования.Поэтому вы захотите скопировать все переменные-члены.В вашем случае конструктор копирования не нужен, потому что у вас есть статический массив.Если бы у вас была динамическая память (то есть, вы использовали new для выделения указателя на Mem), тогда вам это нужно.Однако, чтобы показать вам, как это делается, вы идете.

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;
}
2 голосов
/ 17 марта 2011

Вам необходимо скопировать данные из str в this. Длина проста:

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

Данные немного сложнее. Вы можете использовать strcpy или memcpy, или даже цикл for.

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

Удачи!

0 голосов
/ 17 марта 2011

Я согласен с Корнелом Киселевичем: чем меньше уроки по классу String, тем лучше.Но ты делаешь это только для того, чтобы учиться, поэтому достаточно честно :-).В любом случае: ваш конструктор копирования должен скопировать длину и содержимое массива Mem, и все.

(Если вы делали это, чтобы сделать что-то полезное, а не как учебное упражнение, ядобавим: класс строки с фиксированной максимальной длиной строки, особенно размером не более 32 символов, действительно очень плохая идея, но это вполне разумно, если вам не хочется заниматься распределением и освобождением памяти одновременно.время, когда ты пытаешься вспомнить даже больше основ ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...