如果参数中没有传递任何对象,如何创建具有默认值的对象?

时间:2014-04-11 21:22:17

标签: c++ class constructor

我正在尝试创建一个默认为500的表,如果没有值传递给构造函数。

示例

Table object; //sets table size to 500 by default
Table object(10000); //sets table size to 10000

这就是我目前设置标题的方式:

Class Table{
public:
    Table();
    //other functions excluded
private:
    static const int tableSize = 500;
    std::vector<int> A[tableSize];
}; 

我该怎么做?

2 个答案:

答案 0 :(得分:2)

这可能是您正在寻找的,假设您想要一个而不仅仅是一个序列。您的代码没有提及该表中每个的大小,因此我会使用您所拥有的内容:

class Table
{
public:
    Table(size_t n = tableSize) : A(n) {};

    //other functions excluded
private:
    static const size_t tableSize = 500;
    std::vector< std::vector<int> > A;
};

如果行缓冲区的大小已修复(比如100列),则可以使用std::array<>作为行缓冲区,从而改为:

class Table
{
public:
    Table(size_t n = tableSize) : A(n) {};

    //other functions excluded
private:
    static const size_t tableSize = 500;
    std::vector< std::array<int,100> > A;
};

编辑:增加哈希表

从评论中可以看出,这是为了提供一个哈希表实现,并且这样做需要扩展哈希表(这可能是首要原因之一)。在这种情况下,您可以通过与第一个代码段一起直接扩展原始文件:

void Table::expand()
{
    size_t new_size = 2*A.size() + 1;
    std::vector< std::vector<int>> tmp(new_size);
    for (auto& x : A)
    {
        std::hash<int> hfn;
        for (auto y : x)
            tmp[hfn(y) % new_size].push_back(y);
    }
    std::swap(A,tmp);
}

或类似的东西。您的哈希函数显然需要正确的集成以及可能采用可选的大小因子等,但您可以希望得到这个想法。

答案 1 :(得分:1)

你可以这样做:

Class Table{
public:
    Table(int size = 500): A(size) { }
private:
    std::vector<int> A;
};

(请注意,为了简洁,它以这种方式显示。您可以/应该将接口与其实现分开并在源文件中定义Table::Table,并且初始化列表应该随之而来。)< / p>