指向可以更改指针的对象的智能指针

时间:2015-11-29 16:14:34

标签: c++ pointers c++11 smart-pointers

我希望有一个指向对象| | | Name |one |two |three |X|1. | Ones |0 |0 |0 |X|2. | Twos |0 |0 |0 |X|3. | Threes |0 |0 |0 |X|4. | Fours |0 |0 |0 |X|5. | Fives |0 |0 |0 |X|6. | Sixes |0 |0 |0 |X|7. | Three of a kind |0 |0 |0 |X|8. | Four of a kind |0 |0 |0 |X|9. | Full House |0 |0 |0 |X|1. | Small Straight |0 |0 |0 |X|11.| Large Straight |0 |0 |0 |X|12.| Chance |0 |0 |0 |X|13.| Yahtzee |0 |0 |0 | | | Total Score |0 |0 |0 的智能指针,该对象具有函数A,可以更改智能指针应指向的当前对象f。该函数应该适用于所有智能指针,其理想的语法是:

A

原始指针用作参数和返回值,以使其适用于任何智能指针。此实现中的缺陷是由//usage of f std::unique_ptr<A> p(new A); p.reset(p->f(p.get())); 返回同一指针引起的自我赋值。自我赋值将导致删除f的当前实例,这不是我们想要的。为了解决这个问题,我们可以像这样使用A

f

这需要在智能指针旁边的临时原始指针,它甚至可能指向同一个对象。对我来说,这感觉就像糟糕的设计,我希望有一个更好的解决方案。

我还考虑过通过引用传递智能指针,但这有一些问题:

  • 重置智能指针后不会强制返回,这可能会导致内存损坏。
  • 强制函数将特定的智能指针作为参数。

我是否过度思考这个问题?是否使用临时原始指针来检查智能指针是否需要重置才能实际正常? 另外,为什么//modified usage of f std::unique_ptr<A> p(new A); A* temp = p->f(p.get()); if(p.get() != temp) { p.reset(temp); } 函数还没有检查自我赋值?

澄清更新

首先,在示例中reset可以替换为f(p.get()),因为不需要输入参数。该函数将返回指向自身的指针或创建一个新对象并返回该指针。

感谢所有帮助,到目前为止,这里有一个简短的说明。 类f()旨在用作状态,其具有重复调用的函数以处理程序处于该状态时需要执行的任何操作。这种处理还包括可能改变状态,这是通过将适当的指针返回到新状态来完成的。

我上传了example and explanation(仅使用原始指针)我想要如何使用此类。欢迎提供有关设计的反馈。虽然我意识到这不是最初的问题,但它可能会导致我真正寻求的答案。

2 个答案:

答案 0 :(得分:2)

  

我希望有一个指向对象A的智能指针,该对象具有一个函数f,它可以改变智能指针应该指向的当前对象A.

这是一个非常奇怪的(和尴尬的)面向对象的类设计。您的对象具有成员函数,该函数将修改拥有指向它的指针的对象。强烈建议对您的班级结构进行彻底的重新设计。

你应该设计如下:

  • 您的班级A没有f作为会员功能
  • 包含并管理智能指针的第二个类B,并且f作为成员函数

或者:

  • fA内的静态函数,并引用智能指针:

static f(shared_ptr&amp; shPtr);

答案 1 :(得分:0)

您可以使用std :: unique_ptr的发布方法:

更新:

class A {
public:
    A* f( std::unique_ptr<A> pointer )
    {
        if( /* some condition */ ) {
            return new A;
        } else {
            return pointer.release();
        }
    }
};

std::unique_ptr<A> p( new A );
p.reset( p->f( std::unique_ptr<A>( p.release() ) ) );