返回带有指针的 class 对象
returning a class object with a pointer
我有一个class
class Foo
{
public:
char* ptr;
Foo() { ptr=new char [10]; }
~Foo() { delete [] ptr; }
};
我了解到 return 不可能创建此 class 的对象,因为动态分配的指针是 delete
并在调用函数中创建了一个悬挂指针
那么我怎样才能 return 这个 class 的一个对象呢??
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
}
注意 这些只是我想要的实际 class 的表示,并不是根据推荐标准创建的(即请不要告诉我使用 std::string
或 std::vector
).
So how can I return An object of this class??
您需要实现正确管理内存的复制构造函数和复制赋值运算符。
// 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;
}
我有一个class
class Foo
{
public:
char* ptr;
Foo() { ptr=new char [10]; }
~Foo() { delete [] ptr; }
};
我了解到 return 不可能创建此 class 的对象,因为动态分配的指针是 delete
并在调用函数中创建了一个悬挂指针
那么我怎样才能 return 这个 class 的一个对象呢??
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
}
注意 这些只是我想要的实际 class 的表示,并不是根据推荐标准创建的(即请不要告诉我使用 std::string
或 std::vector
).
So how can I return An object of this class??
您需要实现正确管理内存的复制构造函数和复制赋值运算符。
// 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;
}