数组作为类的私有成员

2023-12-31

我正在尝试创建一个具有私有成员(数组)的类。我不知道数组的大小,直到将值传递到构造函数中才知道。定义类构造函数以及 .h 文件中的定义以允许数组大小可变的最佳方法是什么?


如果你想要一个“真正的”C 风格数组,你必须向你的类添加一个指针私有成员,并在构造函数中为其动态分配内存(使用new)。显然你一定不要忘记在析构函数中释放它。

class YourClass
{
  private:
    int * array;
    size_t size;

    // Private copy constructor operator to block copying of the object, see later
    // C++03:
    YourClass(const YourClass &); // no definition
    // C++11:
    YourClass(const YourClass&) = delete;

  public:
    YourClass(size_t Size) : array(new int[Size]), size(Size)
    {
        // do extra init stuff here
    };

    ~YourClass()
    {
        delete [] array;
    }
};

为了使这项工作更容易,您可以考虑使用智能指针(例如,升压::作用域数组 http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/scoped_array.htm在 C++03 中,或普通std::unique_ptr在 C++11 中),您可以在构造函数之前或简单地在构造函数中使用初始值设定项列表进行初始化。

class YourClass
{
  private:
    boost::scoped_array<int> array; // or in C++11 std::unique_ptr<int[]> array;
    size_t size;
  public:
    YourClass(size_t Size) : array(new int[Size]), size(Size)
    {
        // do extra init stuff here
    }

    // No need for a destructor, the scoped_array does the magic
};

这两种解决方案都会生成不可复制的对象(您没有指定它们是否必须可复制以及它们的复制语义);如果不需要复制该类(大多数情况下都会发生),那么这两种情况都可以,并且如果您尝试将一个类复制/分配给另一个类,则编译器将生成错误,在第一种情况下,因为默认复制构造函数已被私有构造函数重载(或在 C++11 中简单删除),在第二种情况下,因为boost::scoped_array and std::unique_ptr是不可复制的。

相反,如果您希望拥有可复制的对象,则必须决定是否要创建共享数组的副本(因此,只是指针副本),或者是否要为其他对象创建新的单独数组。

在第一种情况下,在释放分配的内存之前必须非常小心,因为其他对象可能正在使用它;参考计数器是最常见的解决方案。您可以通过以下方式获得帮助升压::共享数组 http://www.boost.org/doc/libs/1_41_0/libs/smart_ptr/shared_array.htm (or std::shared_ptr在 C++11 中),它会自动为您完成所有跟踪工作。

相反,如果您想要执行“深层复制”,则必须分配新内存并将源数组的所有对象复制到目标数组。正确执行此操作并非完全微不足道,通常通过以下方式完成“复制和交换习语” https://stackoverflow.com/questions/3279543/what-is-the-copy-and-swap-idiom.

不过,最简单的解决方案是使用std::vector作为私有成员:它将自行处理所有分配/释放内容,在构造/销毁类的对象时正确构造/销毁自身。此外,它还实现了开箱即用的深度复制语义。如果您需要让调用者以只读方式访问向量,那么您可以编写一个返回值的 getterconst_iterator or a const参考vector object.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数组作为类的私有成员 的相关文章