我有一个类将构造函数中的引脚“列表”作为参数。 现在,这个“列表”只是一个常量数组(const unsigned int (&pins)[N]
)。 我想以这样一种方式重载构造函数,即可以使用initializer_list以及(const)数组。
我可以使用单独的类来工作,但我无法将它们合并。具有常量数组和初始化列表的C++重载构造函数
我的测试类的基本结构:
#include <iostream>
#include <cstring>
using namespace std;
class X
{
public:
X(... pins);
~X();
void print() {
for (unsigned int i = 0; i < length; i++)
cout << pins[i] << ' ';
}
private:
(const) unsigned int *pins;
const size_t length;
};
A类(使用std :: initializer_list)
public:
A(initializer_list<unsigned int> pins)
: length(pins.size()) {
this->pins = (unsigned int *)malloc(sizeof(unsigned int) * pins.size());
memcpy(this->pins, pins.begin(), sizeof(unsigned int) * pins.size());
}
~A() {
free(pins);
}
private:
unsigned int *pins;
B类(使用数组)
public:
template <size_t N>
B(unsigned int (&pins)[N])
: length(N) {
this->pins = pins;
}
private:
unsigned int *pins;
C类(使用常量数组)
public:
template <size_t N>
C(const unsigned int (&pins)[N])
: length(N) {
this->pins = pins;
}
private:
const unsigned int *pins;
这让我做这样的事情:
A a({1, 2, 3});
unsigned int pb[] = {4, 5, 6};
B b(pb);
const unsigned int pc[] = {7, 8, 9};
C c(pc);
a.print();
b.print();
c.print();
而这种打印1 2 3 4 5 6 7 8 9
预期。
如何将这些不同的构造函数合并到一个类中? 我希望能够以上述三种方式之一初始化对象。
如果我做一个pins
const
,我不能做这样的事情memcpy(pins, ...)
,如果我不使它成为一个const
,我不能用一个常量数组作为参数的构造函数。
(目标平台是Arduino的,所以最看中和内存密集型C++不支持11个招数。)
B和C可以结合我想如果你通过初始化,而不是在构造函数的内部,那么长(N),引脚(引脚)。 const成员只能通过初始化程序设置,而不能在构造函数中设置。 - 请注意你正在存储一个指针。否则总会有选择使用mutable关键字来设置它,只要确保它保持私有,这样就不会有任何东西可以在构建后混淆 – Giel
因此等待 - 您希望'pins'成为拥有指向堆的指针 - 有时分配内存,但其他时间非拥有指向外部提供的数组的指针?析构函数如何知道它是否应该调用'free(引脚)'? –
是的。但我愿意提供更好的建议。我只需要一个引脚列表,并且我想像'A a({1,2,3})'一样将它初始化为内联,以及使用数组。 – tttapa