Оператор возврата Возвращает нулевое значение указателя, а не требуемое значение

Я выполнил это с помощью отладки, и в функции String Substring все работает вплоть до оператора return.

returnString в приведенном ниже коде имеет правильное значение в строке возврата. Однако, как только я перехожу к следующей строке (закрывающая скобка сразу после), она меняется на:

{Text=0x003ed0e0 "îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ... }String

который я проследил до деструктора, это значение, которое String имеет при удалении.

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

Строка, которая вызывает мою строковую функцию: String LocalString((Address.Substring(0, atIndex))); (Адрес объявляется как String в «private» в соответствующем заголовочном файле)

Подстрока находится чуть ниже половины, сразу после оператора индекса. Если мне кажется, что мне не хватает функции или файла, попросите об этом. Спасибо за чтение и (я надеюсь) помощь.

string.h файл:

#pragma once

#include <iostream>
#include <sstream>
using namespace std;

// C++ String class that encapsulates an ASCII C-string
class String
{
public:
// Default constructor
String()
{
Text = NULL;
}

// MUST HAVE: Copy-constructor that performs deep copy
String(const String& source)
{
Text = NULL;
// Call the assignment operator to perform deep copy
*this = source;
}

// Init-constructor to initialize this String with a C-string
String(const char* text)
{
Text = NULL;
// Call the assignment operator to perform deep copy

*this = text;

}

// Destructor
~String()
{
delete[] Text;
}

// Returns the count of characters in a C-string text; NULL-terminator is not counted
static int GetLength(const char* text)
{
int x = 0;
while(text[x] != '\0')
x++;

return x;
}

// Assignment operator to perform deep copy
String& operator = (const char* text)
{
// Ddispose of old Text
delete[] Text;

// +1 accounts for NULL-terminator
int trueLength = GetLength(text) + 1;

// Dynamically allocate characters on heap
Text = new char[trueLength];

// Copy all characters from source to Text; +1 accounts for NULL-terminator
for ( int i = 0; i < trueLength; i++ )
Text[i] = text[i];

return *this;
}

// if length is not specified, then the substring spans from startPosition until the end of this String
// throws an exception when startPosition is out of bounds
String Substring(int startPosition, int length=0) const
{
char * str = this->GetText();
int strLength = length;
int x = 0;

char* substring = new char[strLength];

while(x < strLength && str[x+startPosition]!='\0')
{
substring[x] = str[x + startPosition];
x++;
}
substring[x]='\0';

String returnString = substring;return returnString;
}

// Returns the count of characters in the String; NULL-terminator is not counted
int GetLength() const
{
return GetLength(Text);
}
private:
// The encapsulated C-string
char* Text;
};

где-то в main.cpp …

String LocalString((Address.Substring(0, atIndex)));
String DomainString((Address.Substring(atIndex + 1)));
// or, in simpler syntax:
/*
* String hell0 = String andGoodbye;
* String smile = String andWave;
*/

-1

Решение

Несмотря на комментарий // Assignment operator to perform deep copy класс не имеет определенного пользователем оператора присваивания.

Оператор присваивания по умолчанию, сгенерированный компьютером, выполняет поверхностное копирование. Содержащийся текст будет потерян, как только одна копия будет уничтожена.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]