gpt4 book ai didi

c++ - 数组作为类的私有(private)成员

转载 作者:IT老高 更新时间:2023-10-28 22:39:04 28 4
gpt4 key购买 nike

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

最佳答案

如果你想要一个“真正的”C 风格数组,你必须在你的类中添加一个指针私有(private)成员,并在构造函数中为它动态分配内存(使用 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;
}
};

为了使这项工作更容易,您可以考虑使用智能指针(例如,C++03 中的 boost::scoped_array,或 C++11 中的普通 std::unique_ptr),您可以使用初始化程序进行初始化在构造函数之前列出,或者只是在构造函数中列出。

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

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

如果您想要拥有可复制的对象,那么您必须决定是要创建一个共享数组的拷贝(因此,只是一个指针拷贝),还是要为其他对象。

在第一种情况下,在释放分配的内存之前必须非常小心,因为其他对象可能正在使用它;引用计数器是最常见的解决方案。 boost::shared_array 可为您提供帮助(或 C++11 中的 std::shared_ptr),它会自动为您完成所有跟踪工作。

如果您想进行“深度复制”,则必须分配新内存并将源数组的所有对象复制到目标数组。正确地做到这一点并不是一件容易的事,通常通过 "copy and swap idiom" 来完成。 .

不过,最简单的解决方案是使用 std::vector作为私有(private)成员:它将自己处理所有分配/释放的东西,当你的类的对象被构​​造/销毁时正确地构造/销毁自己。此外,它实现了开箱即用的深拷贝语义。如果您需要让您的调用者以只读方式访问该 vector ,那么您可以编写一个返回 const_iterator 的 getter。或 const引用 vector对象。

关于c++ - 数组作为类的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2082972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com