【问题标题】:Allow operator= being used only between objects of the same class?允许 operator= 仅在同一类的对象之间使用?
【发布时间】:2012-12-08 05:50:23
【问题描述】:

我有一个类层次结构,我想禁止这样做:

Foo *f = new Foo();
Bar *b = new Bar();

f = b;

其中FooBar 的超类。这样做会分割对象的Bar 部分。我知道您可以通过将operator= 设为私有来解决此问题,但是是否可以仅禁止使用不同类型的赋值运算符?

就像将 operator= 设为私有但仍然允许这样做:

Bar *b1 = new Bar();
Bar *b2 = new Bar();

b1 = b2;

假设子类也将变为Bar

【问题讨论】:

  • operator= 声明在哪里?
  • 在此示例中,您没有分配 FooBar 对象。您正在将 指针 分配给 FooBar。您的示例与您的问题不符。不,您不能禁止指针分配。
  • 如果您同时需要FooBar 对象,是否可以不使用继承而使用接口?
  • 哦,我明白了,所以如果我强制使用指针我不会有这个问题?
  • 我注意到您问的是防止切片,但由于您的左侧已经是一个已知为父大小的对象,您遇到的真正问题是什么试图解决?在您的情况下是否总是不希望分配不同的类型?

标签: c++ inheritance assignment-operator private-methods object-slicing


【解决方案1】:

既然你在谈论切片,我假设你实际上试图阻止的是:

Foo f;
Bar b;

f = b;

在这种情况下,是的,您可以通过将适当的 operator= 设为私有来阻止分配。

您无法阻止指针分配,但请注意,指针分配无论如何都不会导致切片。

【讨论】:

  • 是的,这就是我想要阻止的,我对 C++ 还很陌生,所以......但是如果我强制使用指针,我不会有这个问题?
  • 我建议不要实现 Virtual Assignment Idiom,因为父对象可能指向不同类型的子对象而不是其他对象。我会遵守分配需要两个相同的叶子或子类型的规则。
  • 如果使用指针,切片不会有问题。从问题中的有限信息很难判断使用指针是否最适合您的应用程序。通过一些奇怪的代码结构强制使用指针可能不是一个好方法......
  • 我将拥有一个 newInstance() 类型的方法,该方法将返回一个指向对象的指针,因此将强制使用指针。我认为这还不错?
【解决方案2】:

这超出了您的能力范围:用户定义的运算符必须采用至少一个用户定义(非内置)类型的参数。由于指针是内置类型,所以你在这里不走运。无论您做什么,f = b 都是合法的。

【讨论】:

    【解决方案3】:

    在您的示例中不会发生切片:

    Foo *f = new Foo();
    Bar *b = new Bar();
    
    f = b;
    

    您分配的是指针,而不是值。 f 指针和 b 指针的大小相同(您正在运行的体系结构上的指针的大小),因此它们将始终彼此适合而无需切片。对象本身不受此分配的影响,也不会被切片。

    但这会导致 'new Foo()' 泄漏。赋值后,f 和 b 都将指向 'new Bar()' 并且你将没有指向 'new Foo()' 的指针,你可以用它来删除它。

    我能否建议您使用 std::unique_ptr 而不是原始指针。这会帮你删除。

    std::unique_ptr<Foo> newInstance()
    {
        return new Foo();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2011-02-06
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多