2016-12-10 13 views
-1

У меня есть классвозвращает объект класса с указателем

class Foo 
{ 
    public: 
    char* ptr; 
    Foo() { ptr=new char [10]; } 
    ~Foo() { delete [] ptr; } 
}; 

Я узнал, что возвращающий объект этого класса не представляется возможное, как динамически распределяемой указатель delete «редактора и создает оборванный указатель в вызывающая функция

Так как я могу вернуть объект этого класса ??

Foo Bar() 
{ 
    Foo obj; 
    return obj; 
} 

Может ли быть решен путем добавления конструктора копирования

Foo::Foo(const Foo& obj) 
{ 
    ptr = new char [10]; 
    for(int i = 0 ; i < 10 ;++i) 
     ptr [i] = obj.ptr[i]; 
} 

и функции, как

Foo Bar() 
{ 
    Foo obj; 
    return Foo(obj);  //invokes copy constructor 
} 

Примечания Это просто представление фактического класса я хочу и не созданный в соответствии с рекомендованными стандартами (т. е. пожалуйста, не говорите мне использовать std::string или std::vector).

+0

@PaulMcKenzie Это не объясняет, что делать, чтобы преодолеть это. – WARhead

+1

Ссылка показывает, что вам нужен конструктор копирования, оператор присваивания и деструктор. – PaulMcKenzie

+1

@WARhead, вы посмотрели раздел ** Управление ресурсами ** в первом ответе? –

ответ

0

Так как я могу вернуть объект этого класса ??

Вам необходимо реализовать конструктор копирования и оператор присваивания копий, который правильно управляет памятью.

// Copy constructor 
Foo(Foo const& copy) : ptr(new char[strlen(copy.ptr)+1]) 
{ 
    strcpy(ptr, copy.ptr); 
} 

// Copy assignment operator 
Foo& operator=(Foo const& rhs) 
{ 
    // Don't do anything for self assignment 
    if (this != &rhs) 
    { 
     delete [] ptr; 
     ptr = new char[strlen(rhs.ptr)+1]); 
     strcpy(ptr, rhs.ptr); 
    } 
    return *this; 
} 

Если ptr всегда будет массивом из 10 char с, вам необходимо переосмыслить конструктор копирования и копирование назначения.

// Copy constructor 
Foo(Foo const& copy) : ptr(new char[10]) 
{ 
    memcpy(ptr, copy.ptr, 10); 
} 

// Copy assignment operator 
Foo& operator=(Foo const& rhs) 
{ 
    // Don't do anything for self assignment 
    if (this != &rhs) 
    { 
     memcpy(ptr, rhs.ptr, 10); 
    } 
    return *this; 
} 
+0

int оператор присваивания - это 'Foo const &' или 'const Foo &' ?? Или это не имеет значения? – WARhead

+0

@WARhead, это не имеет значения. Я предпочитаю стиль кодировки Foo const & '. –

 Смежные вопросы

  • Нет связанных вопросов^_^