2017-08-19 50 views
0

我有一个类将构造函数中的引脚“列表”作为参数。 现在,这个“列表”只是一个常量数组(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预期。

如何将这些不同的构造函数合并到一个类中? 我希望能够以上述三种方式之一初始化对象。

如果我做一个pinsconst,我不能做这样的事情memcpy(pins, ...),如果我不使它成为一个const,我不能用一个常量数组作为参数的构造函数。

(目标平台是Arduino的,所以最看中和内存密集型C++不支持11个招数。)

+0

B和C可以结合我想如果你通过初始化,而不是在构造函数的内部,那么长(N),引脚(引脚)。 const成员只能通过初始化程序设置,而不能在构造函数中设置。 - 请注意你正在存储一个指针。否则总会有选择使用mutable关键字来设置它,只要确保它保持私有,这样就不会有任何东西可以在构建后混淆 – Giel

+3

因此等待 - 您希望'pins'成为拥有指向堆的指针 - 有时分配内存,但其他时间非拥有指向外部提供的数组的指针?析构函数如何知道它是否应该调用'free(引脚)'? –

+0

是的。但我愿意提供更好的建议。我只需要一个引脚列表,并且我想像'A a({1,2,3})'一样将它初始化为内联,以及使用数组。 – tttapa

回答

1

东西沿着这些路线,也许是:

class X 
{ 
    public: 
    X(std::initializer_list<unsigned int> aPins) 
     : storage(aPins), length(aPins.size()) { 
     pins = length ? &storage[0] : nullptr; 
    } 

    template <size_t N> 
    X(unsigned int (&aPins)[N]) 
     : length(N) { 
     pins = aPins; 
    } 

    template <size_t N> 
    X(const unsigned int (&aPins)[N]) 
     : length(N) { 
     pins = aPins; 
    } 

    void print() { 
     for (unsigned int i = 0; i < length; i++) 
      std::cout << pins[i] << ' '; 
    } 

    private: 
    const unsigned int* pins; 
    const size_t length; 
    std::vector<unsigned int> storage; 
}; 

Demo

+0

谢谢,但令人遗憾的是,Arduino不支持向量的使用。 – tttapa

+0

但引脚总是'常量'多数民众赞成在操作系统的问题,我会说 –

+2

@tttapa使'存储'一个普通的指针,然后分配'malloc'然后。使用'std :: vector'不是这个例子的基础。 –