"Klasa string" - pytanie

0

//Napisać klasę o nazwie string, która będzie miała możliwości bardziej zbliżone do ciągu
znaków niż do tablicy znaków. Oznacza to, że powinna reprezentować ciągi znaków
o dowolnej długości – pamięć jest przydzielana dynamicznie//

O co chodzi w: "pamięć jest przydzielana dynamicznie"?
Czy nie wystarczy tylko zrobić const char*?

0

To znaczy,że na początku jak tworzy się ów obiekt string to może on zawierać tekst np "Ala",ale jak kogoś najdzie fantazja wpisać do tegoż obiektu "Ala ma kota" to się bidny posypie.
Potemu właśnie masz zarządzać pamięcią przechowywującą łańcuch znaków,żeby do posypania nie doszło.

0
Izaaa napisał(a)

Napisać klasę o nazwie string, która będzie miała możliwości bardziej zbliżone do ciągu
znaków niż do tablicy znaków.

Zależy, jakie możliwości zbliżone do "ciągu znaków" chce się zawrzeć w klasie;

Izaaa napisał(a)

Oznacza to, że powinna reprezentować ciągi znaków
o dowolnej długości

Czyli w sumie podobnie, jak to ma miejsce w standardowym typie String;

Izaaa napisał(a)

pamięć jest przydzielana dynamicznie

Tzn., że dla łańcuch nie zajmuje na sztywno jakiegoś stałego miejsca, tylko jest ustalana proporcjonalnie do ilości znaków w nim się znajdujących; Równie dobrze możesz mieć dynamiczną macierz przechowującą pojedyncze znaki, jak i listę jedno czy dwukierunkową; W każdym razie modyfikując ten ciąg musisz ręcznie przydzielać i zwalniać pamięć;

0

Skoro nie ma przypominać tablicy znaków to po prostu chyba chodzi o listę. Dynamiczne alokowanie polega na dodawaniu kolejnych węzłów (elementów ciągu) do listy.

0
xeo545x39 napisał(a)

Skoro nie ma przypominać tablicy znaków to po prostu chyba chodzi o listę.

Pewnie i tak; Choć jak wewnątrz klasy znaki będzie się przechowywać w dynamicznej macierzy to też się krzywda chyba nie stanie; Tablica owszem będzie, ale to tylko metody będą się do niej odwoływać, tablica jako taka nie musi być widoczna jako właściwość klasy i przypominać jej nie będzie :)

EDIT: Coś w tym stylu (kod w pascalu, bo kostrukcji w C++ nie pamiętam na tyle...):

unit uString;

interface

type
  TString = class(TObject)
  private
    FArr: array of Char;
  protected
    function GetLength(): Integer;
  public
    constructor Create(sDefValue: String);
    destructor Destroy(); override;

    procedure SetStr(sNewValue: String);
    function GetStr(): String;
  published
    property Length: Integer read GetLength;
  end;

implementation

  constructor TString.Create(sDefValue: String);
  var
    I: Integer;
  begin
    inherited Create();

    case System.Length(sDefValue) of
      0: SetLength(FArr, 0);
    else
      SetLength(FArr, System.Length(sDefValue));

      for I := 0 to System.Length(sDefValue) - 1 do
        FArr[I] := sDefValue[I + 1];
    end;
  end;

  destructor TString.Destroy();
  begin
    inherited Destroy();
  end;

  procedure TString.SetStr(sNewValue: String);
  var
    I: Integer;
  begin
    SetLength(FArr, System.Length(sNewValue));

    for I := 0 to System.Length(sNewValue) - 1 do
      FArr[I] := sNewValue[I + 1];
  end;

  function TString.GetStr(): String;
  var
    I: Integer;
  begin
    Result := '';

    if System.Length(FArr) > 0 then
      for I := 0 to System.High(FArr) do
        Result := Result + FArr[I];
  end;

  function TString.GetLength(): Integer;
  begin
    Result := System.Length(FArr);
  end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1