【问题标题】:returning a class object with a pointer [duplicate]返回带有指针的类对象[重复]
【发布时间】:2017-04-25 15:27:05
【问题描述】:

我有课

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)。

【问题讨论】:

  • 链接显示你需要一个拷贝构造函数、赋值运算符和析构函数。
  • @WARhead,你看过第一个答案中的管理资源部分吗?
  • @WARhead 该链接有一个与您的代码几乎相同的示例,其中包含对情况和操作的完整说明。您没有阅读管理资源部分吗?
  • @WARhead -- 如果你知道三法则,为什么还要问它是否能解决问题?明确需要规则 3 来解决您的问题。
  • @WARhead -- 你在阅读我指出的链接吗?您将确切了解如何编写复制构造函数和赋值运算符。你在拖钓吗?

标签: c++ pointers return destructor dynamic-allocation


【解决方案1】:

那么我怎样才能返回这个类的一个对象呢??

您需要实现正确管理内存的复制构造函数和复制赋值运算符。

// 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 个 chars 的数组,则需要重新考虑复制构造函数和复制赋值。

// 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;
}

【讨论】:

  • int 赋值运算符是Foo const&amp; 还是const Foo&amp;??还是没有区别??
  • @WARhead,它没有任何区别。我更喜欢Foo const&amp; 编码风格。
猜你喜欢
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
相关资源
最近更新 更多