在c ++的构造函数中初始化数组

时间:2014-06-06 07:46:13

标签: c++ arrays constructor initialization

我不知道如何通过构造函数初始化数组。我知道将数组初始化为所有0值的一种方法是从这里开始 How to initialize all elements in an array to the same number in C++ 但是,我需要遵循您在我的代码中看到的约定。我需要 setArr() getArr()以及构造函数。 你能否告诉我,为构造函数和那些函数添加什么,以便 arr [5] 能正常工作,就像 i 一样? 我将非常感谢您的解释,因为我没有在数组的构造函数中找到此类初始化的示例。 谢谢, 问候

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
class A
{
private:
    double arr[5];
    int i;
public:
    //THIS HERE IS WRONG, BUT HOW TO PROGRAMM IT SO THAT I GET NO ERRORS?
    A( double arrx = {0}, int ix = 4):, i(ix) 
    {
        std::vector<double> v1(arrx, arrx+5);
        std::fill(v1.begin(arr), v1.end(arr), arrx);
    }
    ~A() {}
    void setI( int ix ) { i = ix; }
    double getI(void) { return i; }
    void setArr( double arrx[] ) 
    {
        for (int i=0; i < sizeof(arrx); i++)
            arr[i] = arrx[i];
    }
    double* getArr(void) {  return arr; }
};

int main()
{
    A ob1(6);
    //ob1.setI(5);
    std::cout << ob1.getI() << std::endl;
}

编辑: 我将更新代码,直到它工作,以便其他人可以在以后受益。 我纠正并得到错误C2661:'std :: vector&lt; _Ty&gt; :: begin':没有重载函数需要1个参数

1 个答案:

答案 0 :(得分:2)

首先,在我看来,你的班级设计没有任何意义。 :) 不过我认为你需要至少三个(甚至四个)构造函数:默认构造函数,带初始化列表的构造函数和带有两个参数的构造函数。例如

#include <iostream>
#include <initializer_list>
#include <algorithm>
#include <iterator>
#include <stdexcept>

class A
{
private:
    static const size_t MAX_SIZE = 5;  
    double arr[MAX_SIZE];
    size_t i;
public:
    A() : arr{}, i( MAX_SIZE ) {}

    A( size_t n, double x = 0.0 ) : arr{}, i( n < MAX_SIZE ? n : MAX_SIZE )
    {
        std::fill( arr, arr + i, x );
    }

    A( double a[], size_t n ) 
        : arr{}, i( n < MAX_SIZE ? n : MAX_SIZE )
    {
        std::copy( a, a + i, arr );
    }

    A( std::initializer_list<double> l ) 
        : arr{}, i( l.size() < MAX_SIZE ? l.size() : MAX_SIZE )
    {
        std::copy( l.begin(), std::next( l.begin(), i ), arr );
    }

    void SetValue( double value, size_t n )
    {
        if ( n < i ) arr[n] = value;
    }

    double GetValue( size_t n ) const throw( std::out_of_range )
    {
        if ( i <= n ) throw std::out_of_range( "A::GetValue" );
        return ( arr[n] );
    }

    size_t GetI() const
    {
        return i;
    }
};

int main() 
{
    A a = { 1.0, 2.0, 3.0, 4.0, 5.0 };

    for ( size_t i = 0; i < a.GetI(); i++ ) std::cout << a.GetValue( i ) << ' ';
    std::cout << std::endl;

    try
    {
        a.GetValue( 5 );
    }
    catch( const std::out_of_range &e )
    {
        std::cout << e.what() << std::endl;
    }

    return 0;
}

输出

1 2 3 4 5 
A::GetValue

编辑:如果您的编译器不支持使用初始化列表进行ctor初始化,那么而不是两个构造函数

    A() : arr{}, i( MAX_SIZE ) {}

    A( size_t n, double x = 0.0 ) : arr{}, i( n < MAX_SIZE ? n : MAX_SIZE )
    {
        std::fill( arr, arr + i, x );
    }

你可以定义一个构造函数。例如

A( size_t n = MAX_SIZE, double x = 0.0 ) : i( n < MAX_SIZE ? n : MAX_SIZE )
{
    std::fill( arr, arr + i, x );
}