2016-03-30 6 views
1

In erster Linie möchte ich klarstellen, dass dies eine frühere Hausaufgabe ist, die ich hatte, aber nicht herausfinden konnte und dass ich immer noch versuche, meinen Kopf einzuwickeln . Dies sind die Anweisungen für den sekundären Konstruktor:Bestimmen der maximalen Kapazität eines Char-Pointers in der dynamischen Speicherzuweisung

NIUString :: NIUString (const char * andere)

Dieser Konstruktor für die NIUString Klasse sollte ein neues NIUString Objekt an den C-String other initialisieren. Die erforderliche Logik lautet:
Legen Sie die Zeichenfolgengröße für das neue Objekt auf die Länge der C-Zeichenfolge other fest.
Legen Sie die Zeichenfolgenkapazität für das neue Objekt auf die Zeichenfolgengröße fest.
Wenn die String-Kapazität 0 ist, legen Sie den String-Array-Zeiger für das neue Objekt auf nullptr fest. Andernfalls verwenden Sie den String-Array-Zeiger für das neue Objekt, um ein Array von char zuzuweisen. Die Anzahl der Elemente im neuen String-Array sollte der String-Kapazität entsprechen.
Kopieren Sie die Zeichen der C-Zeichenfolge other (bis einschließlich, jedoch ohne das Nullzeichen) in das Zeichenfolgenarray.

Für meine Ausgabe soll ich

testet den zweiten Konstruktor
s2 erhalten: einen Text
s2 Größe: 9
s2 Kapazität:
s2 ist nicht leer

aber stattdessen bekomme ich ...

an zweiter Stelle Konstruktor testen
s2: einen Text
Größe s2: 9
s2 Kapazität:
s2

nicht leer ist

Nach Recherchen erfuhr ich, dass das, weil ist Sie können sizeof nicht für einen Zeiger verwenden, da er Ihnen nur die Größe des Zeigers im Speicher und nicht die tatsächliche Größe der Zeichenfolgenkapazität angibt.

Hier ist mein Code für die Methode schrieb ich

//secondary constructor 
NIUString::NIUString(const char* other) 
{ 
    Capacity = sizeof(other); 
    Size = strlen(other); 

    if (Capacity == 0) 
    { 
     arrayPoint = nullptr; 
    } 
    else 
     arrayPoint = new char[Capacity]; 
    strcpy(arrayPoint, other); 

} 

Wie dem auch sei, meine Frage ist: Was ist die Art und Weise, in der dies getan werden kann? Ich habe ein bisschen daran gearbeitet, aber ich habe kein Beispiel gefunden, das ähnlich genug ist, um mir zu helfen. Wenn mich jemand in die richtige Richtung führen kann, wäre das sehr nützlich.

Dies ist der Code, den ich verwende, um meine Methode/Klasse zu testen; Alles andere funktioniert gut, außer der Kapazität des Arrays.

NIUString s2 = "some text"; 

cout << "s2: " << s2 << endl; 
cout << "s2 size: " << s2.size() << endl; 
cout << "s2 capacity: " << s2.capacity() << endl; 
cout << "s2 is " << ((s2.empty()) ? "empty\n" : "not empty\n"); 
cout << endl <<endl << endl; 
+2

'sizeof (andere);' ist invariant: Die Größe eines beliebigen Zeigers. –

+0

Was ist Kapazität? Ist das nicht die gleiche Größe? Wonach suchst du genau? – perencia

+0

Können Sie die Signatur des Konstruktors ändern? – Fearnbuster

Antwort

0

Ok, sizeof nur Wok, wenn Sie Zugriff auf die ursprüngliche Zeigervariable haben (die statisch sein müssen). Normalerweise verwenden Sie C++ - Klassen und müssen nicht darüber nachdenken.

Ich denke, sie wollen diesen Code: „Legen Sie die Zeichenfolge Kapazität für das neue Objekt in die Stringgröße“

NIUString::NIUString(const char* other) 
{ 
    Size = strlen(other); 

    if (Capacity == 0) 
    { 
     arrayPoint = nullptr; 
    } 
    if (Capacity <= Size + 1) 
    { 
     Capacity = Size + 1; 
    } 
    arrayPoint = new char[Capacity]; 
    strcpy(arrayPoint, other); 

} 
+0

Ich glaube, dass Sie "Capacity" verwenden, ohne es zu initialisieren. – Fearnbuster

+0

Ich höre, dass Capacity etwas wie eine statische Variable ist, obwohl Gerardos Antwort besser ist –

0

dies nach

„für das neue Objekt auf die Länge des C-String anderen Stellen Sie die String-Länge.“ Getan

Deshalb:

  • Zeichenfolge Größe = Stringlänge

  • String Kapazität = String Größe

dann:

  • String Kapazität = Stringlänge

Ich denke, sie für diese fragen:

//secondary constructor 
NIUString::NIUString(const char* other) 
{ 
    Capacity = Size = strlen(other); 

    if (Capacity == 0) 
    { 
     arrayPoint = nullptr; 
    } 
    else 
     arrayPoint = new char[Capacity]; 

    strcpy(arrayPoint, other); 
} 
+0

später in der Zuweisung müssen wir die Kapazität eines Objekts ändern, ohne die Größe zu ändern. Wenn wir die Kapazität gleich der String-Länge einstellen, würde das später auch die Größe ändern? Ich bin nicht sicher, es ist eine ehrliche Frage meinerseits ich bin ziemlich neu, so dass ich eine harte Zeit mit diesem – TriMyc

+1

Eigentlich nein, würde es nicht. Sie sehen, die Kapazität auf einen anderen Wert zu ändern ist so einfach wie "Kapazität =" der Wert der neuen Kapazität "". Die "Größe" würde sich nur mit der Kapazität ändern, wenn Sie: "Größe = Kapazität" oder: "Größe =" der Wert der neuen Kapazität "". Sie verknüpfen ** die Kapazität in keiner Weise mit der Größe, indem Sie einfach die Größe der Kapazität zuweisen. – Fearnbuster

+0

Wow, das macht jetzt logisch Sinn für mich jetzt, ich denke, ich war verwirrt mit dem Wortlaut der Aufgabe, aber nicht, dass Sie es so gut auslegten, es scheint auf jeden Fall, was von der Aufgabe erforderlich war – TriMyc

2

die Sie interessieren, tun, was Sie wollen:

1) Automatisch gefüllte Kapazität

2) Kapazität> Größe

BUT andere Parameter darf nicht mit neuen zugeordnet:

template <int _size> 
NIUString::NIUString(const char (&other)[_size]) 
{ 
    Capacity = _size; 
    Size = strlen(other); 

    if (Capacity == 0) 
    { 
     arrayPoint = nullptr; 
    } 
    else 
    { 
     arrayPoint = new char[Capacity]; 
     strcpy(arrayPoint, other); 
    } 
} 

void main() 
{ 
    char aux[20];// this works 
    strcpy(aux, "test"); 
    NIUString niu(aux); 
} 
+0

Es mag nicht wichtig sein, und ich möchte nicht wie ein Besserwisser klingen, wenn ich das sage, aber wenn das eine Hausaufgabe ist, dann ist es wahrscheinlich, dass er die Unterschrift des Konstruktors nicht verändern kann; Nur wie der Konstruktor seine Aufgabe intern ausführt. Ich könnte mich jedoch irren, also fragen wir ihn. – Fearnbuster

0

Da der Endpunkt des Zeichenfeldes (die dynamisch zugewiesen wird) nicht angegeben wird, sizeof wird nicht Tun Sie, was Sie wollen.