带有大小由CTOR传递的数组成员的C ++类

时间:2016-07-08 13:08:52

标签: c++ arrays c++11

为什么我不能将m_data数组作为这样的成员?

class Array
{
private:
    const int m_capacity;
    int m_data[m_capacity];

public:
    Array(const int capacity = 100);
};


Array::Array(const int capacity /*= 100*/)
    : m_capacity(capacity)
{

}

如何在没有动态内存分配的情况下实现这一目标?

4 个答案:

答案 0 :(得分:5)

在这种情况下,编译器无法知道class Array的大小,也无法确定此类对象的大小。如果允许不确定编译时大小的对象,则整个语言将有所不同。

但是,如果您在编译时知道容量,则可以编写

template <int Size = 100>
class Array
{
private:
    int m_data[Size];

public:
    Array();
};

然后,要使用它,你可以

Array<> a; //size = 100
Array<250> b; //size = 250

正如@Superlokkus在评论中提到的,C ++ 11 std::array只是一个具有相同概念的更好的实现。

答案 1 :(得分:2)

我建议使用std :: array而不是构建自己的轮

#include <array>
template< unsigned long N >
using Array = std::array<int, N>;

并使用Array作为普通的模板类

Array<100> arr;

如果你热衷于100个大小的阵列,那就更简单了

using Array = std::array<int, 100>;
Array arr;

答案 2 :(得分:2)

您可以声明像这样的模板类

var Person = [String:String]()

或者您应该使用数据成员

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    cell.layer.backgroundColor = UIColor.clearColor().CGColor
    cell.layer.shadowColor = UIColor.blackColor().CGColor
    cell.layer.shadowOffset = CGSizeZero
    cell.layer.shadowRadius = 4
    cell.layer.shadowOpacity = 0.5
    cell.layer.shadowPath = UIBezierPath(rect: cell.bounds).CGPath
    cell.layer.masksToBounds = false

}

而不是数组。

答案 3 :(得分:0)

在没有动态分配的情况下,您不能拥有在运行时选择其大小的对象。你可以在没有裸new / delete的情况下拥有它;封装该要求的普通类是std::vector

或者,您可以拥有一系列不同大小的课程。正常的类是std::array