欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

一种通用的C++类或者结构成员变量的初始化方法

程序员文章站 2022-03-19 20:23:09
一种通用的C++类或者结构成员变量的初始化方法 C++11提供了新的特性,可以初始化一些类或者结构成员变量,尤其某类实例化的变量的初始化,下面介绍一种在C++98中也可以初始化类...
一种通用的C++类或者结构成员变量的初始化方法

C++11提供了新的特性,可以初始化一些类或者结构成员变量,尤其某类实例化的变量的初始化,下面介绍一种在C++98中也可以初始化类成员变量的通用方法:

先上代码

#include 
#include 

template
struct CA
{
    CA(int init_size):length(0), item_size(init_size){}
    const T operator[](int idx) const 
    {
        return static_cast(idx*idx);
    }

    int length;
    int item_size;
};

struct CB
{
    CA ca(10);   
};

int main()
{
    CB cb;
    std::cout << "cb[5] = " << cb.ca[5] << "\n";
    return 0;   
}

这段代码一定编译不过,因为

main.cpp:23:16: error: expected identifier before numeric constant

     CA ca(10);

                ^~

main.cpp:23:16: error: expected ',' or '...' before numeric constant

main.cpp: In function 'int main()':

main.cpp:29:39: error: invalid types '[int]' for array subscript

     std::cout << "cb[5] = " << cb.ca[5] << "\n";

                                       ^

在C++11中,可通过

CA ca = 10;

来解决这一问题。下面介绍另外一种方法,就是通过模板初始化来解决,在C++98中也能兼容

#include 
#include 

template<
    typename T=bool,
    int init_array_size = 0>
struct CA
{
    CA(): length(0), item_size(init_array_size){}
    CA(int init_size):length(0), item_size(init_size){}
    const T operator[](int idx) const 
    {
        return static_cast(idx*idx);
    }

    int length;
    int item_size;
};

struct CB
{
    CA ca;   
};

int main()
{
    CB cb;
    std::cout << "cb[5] = " << cb.ca[5] << "\n";
    return 0;   
}

主要的改动在

CA template中加入init_array_size 模板参数 CA的无参数构造函数的实现 成员变量ca的类型改为CA