当前位置: 首页 > 知识库问答 >
问题:

C重载构造函数,带有常量数组和initializer\u list

陈晟睿
2023-03-14

我有一个类,它将引脚的“列表”作为构造函数中的参数。现在,这个“列表”只是一个const数组(const无符号int(

我的测试类的基本结构:

#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\u列表)

  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();

这将按预期打印12 3 4 5 6 7 8 9。

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

如果我使pins成为const,我就不能做memcpy(pins,…) ,如果我不将其设置为常量,则不能将常量数组用作构造函数的参数。

(目标平台是Arduino,因此不支持最花哨和内存密集型的C 11技巧。)


共有1个答案

勾起运
2023-03-14

大概是这样的:

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;
};

演示

 类似资料:
  • 主要内容:类继承和初始化,初始化器继承和覆盖在Swift 4中声明的类,结构体和枚举初始化以准备类的实例。 存储属性初始化初始值,对于新实例也初始化值,初始化值以准备初始实例数据。 创建初始化由方法执行。 Swift 4初始化程序与Objective-C的不同之处在于它不返回任何值。 它是在处理之前检查新创建实例的初始化。 Swift 4还提供了“取消初始化”过程,用于在取消分配实例后执行内存管理操作。 存储属性的初始化程序角色 存储属性必

  • 本文向大家介绍C++中构造函数重载,包括了C++中构造函数重载的使用技巧和注意事项,需要的朋友参考一下   当类中没有定义构造函数时,C++编译器自动提供无参构造函数和拷贝构造函数   当类中定义了任意的拷贝构造函数,C++不提供无参构造函数。 系统自动提供的构造函数   无参构造函数      函数体为空   拷贝构造函数      简单的进行成员变量的值复制      Test t1;    

  • 本文向大家介绍解析C++中构造函数的默认参数和构造函数的重载,包括了解析C++中构造函数的默认参数和构造函数的重载的使用技巧和注意事项,需要的朋友参考一下 C++构造函数的默认参数 和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值。 【例】 程序运行结果为: 程序中对构造函数的定义(第12-16行)也可以改写成参数初始化

  • 我面临的问题参数化构造函数与数组用户输入。 我的问题是: 创建一个名为Student的类,并创建一个具有参数的构造函数,如Student(int i,string n,double s)。有三个私有变量,分别为int id,string name,double score,使用int getID()、string getName()、double getScore()获取输入,使用void pri

  • 我对复制构造函数是新手,当我开始使用向量时,似乎无法让它们工作。 我在编译时遇到的错误是: 机器人cpp:复制构造函数中的Robot::Robot(const Robot 如何在复制构造函数中复制向量数组?

  • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问