【问题标题】:Constructor with array parameters带数组参数的构造函数
【发布时间】:2019-07-05 13:13:40
【问题描述】:

我想创建一个具有数组和数组大小的构造函数,这样我就可以使用这个来调用对象:Multime m1 = Multime({1, 2, 3}, 3); 或者我应该使用 std::vector 代替吗?

class Multime
{
private:
    int elemente[100];
    int size;
public:
    Multime(){}
    Multime(int el[50], int s){
        this -> size = s;
        for(int i = 0; i < this -> size; i++)
            this -> elemente[i] = el[i];
    }
};

int main()
{
    Multime m1 = Multime({1, 2, 3}, 3);
    return 0;
}

我得到没有匹配的构造函数用于初始化'Multime'

【问题讨论】:

  • elemente 是否应该始终包含 100 个元素?
  • 使用std::vector 或std::initializer_list 作为参数怎么样?
  • 您确定{1, 2, 3} 计算结果为整数数组吗?
  • 您不能将数组作为参数传递。有关更多信息,请参阅 C++ 书中解释函数参数类型如何衰减的章节。在 C++11 后的词中,您可以声明 std::initializer_list 参数并避免需要传递显式数组大小参数,这将起作用;但这是一个相当高级的主题,有关详细信息,请参阅您的 C++ 书籍。
  • 顺便说一句,如前所述,您不能将 C 样式的数组作为参数简单地传递。就像在 C 中一样,像 int el[](大小无关)这样的参数声明将被视为 int* el,换句话说,该函数需要一个指针作为参数。您的编译器应该在完整的错误消息中提到它(尽管它可能有点间接)。

标签: c++ class oop constructor


【解决方案1】:

或者我应该使用 std::vector 代替吗?

这是个好主意。

class Multime
{
private:
    std::vector<int> elemente;
public:
    Multime() {}
    Multime(std::vector<int> el) : elemente(std::move(el)) {}
};

int main()
{
    Multime m1 = Multime({ 1, 2, 3 });
    return 0;
}

【讨论】:

  • 如果你使用构造函数初始化列表会更好。 ;)
  • @Someprogrammerdude 好主意。我经常忘记这个功能。
  • 更好:elemente(std::move(el)).
  • 谢谢,我决定最好使用 std::vector 但我使用 push_back Multime(vector&lt;int&gt; el, int s){ this -&gt; size = s; for(int i = 0; i &lt; this -&gt; size; i++) this -&gt; elemente.push_back(el[i]); 而不是 move
  • @Andrei,不要这样做。 1)您通过副本获取el,但您不使用移动构造函数将该副本存储在您的对象中。复制是多余的:通过 const-reference 获取 el。 2) 循环中的push_backing 会导致冗余重新分配:在循环之前使用elemente.reserve(s); 预分配空间。 3)向量的大小不要使用int,使用std::size_t并与标准库保持一致。
【解决方案2】:

如果您希望您的类能够包含不同数量的元素(在编译时定义),您可以尝试:

#include <array>

template <size_t _Size>
class Multime
{
private:
    int elemente[_Size];
public:
    Multime() {}

    Multime(const std::array<int, _Size>& p_elements)
    {
        for (int i = 0; i < _Size; ++i)
            this->elemente[i] = p_elements[i];
    }
};

int main()
{
    Multime<3> m1({1, 2, 3});
    return 0;
}

你也可以直接将 std::array 存储到你的类中,这样构造更干净

#include <array>

template <size_t _Size>
class Multime
{
private:
    std::array<int, _Size> elemente;
public:
    Multime() {}
    Multime(const std::array<int, _Size>& p_elements) : elemente(p_elements) {}
};

int main()
{
    Multime<3> m1({1, 2, 3});
    return 0;
}

【讨论】:

  • 使用std::array 成员也可以简化构造函数。
  • 由他决定,我不想打破他的逻辑
  • 保留名称_Size。将其更改为_size 或Size,任何以下划线后跟大写字母开头的名称都将保留为标准
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2013-11-07
  • 2015-01-13
相关资源
最近更新 更多