2016-12-10 90 views
-1

我有一个类返回类对象的指针

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

我已经了解到,返回这个类的一个对象是不可能的,因为动态分配指针是delete“ED和在创建一个悬空指针调用函数

那么如何返回这个类的一个对象?

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::stringstd::vector)。

+0

@PaulMcKenzie它没有解释怎么做才能克服它。 – WARhead

+1

该链接显示您需要复制构造函数,赋值运算符和析构函数。 – PaulMcKenzie

+1

@Warhead,你看过第一个答案中的** Managing Resources **部分吗? –

回答

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&'编码风格。 –