8

私は次のことをしようとしています:

class sig
{
public:

int p_list[4];
}

sig :: sig()
{
p_list[4] = {A, B, C, D};
}

エラーが発生する

コンストラクターに式がありません。

では、配列を初期化するにはどうすればよいでしょうか。

4

6 に答える 6

19

C++11 のみ:

class sig
{
    int p_list[4];
    sig() : p_list { 1, 2, 3, 4 }   {   }
};

11 より前では、ブロック スコープの自動および静的配列または名前空間スコープの静的配列以外の配列を初期化することはできませんでした。

于 2012-07-23T10:08:55.760 に答える
8

では、配列を初期化するにはどうすればよいでしょうか。

通常のイニシャライザ リスト構文を使用します。

sig::sig() : p_list{1, 2, 3, 4}
{ }

これは C++11 でのみ機能することに注意してください。boost::arrayその前に、関数内で初期化する必要があります。

于 2012-07-23T10:09:04.670 に答える
5

コンパイラが C++11 の初期化をサポートしていない場合は、各フィールドを個別に割り当てる必要があります。

p_list[0] = A;
p_list[1] = B;
p_list[2] = C;
p_list[3] = D;
于 2012-07-23T10:15:17.743 に答える
2

現在のコンパイラがまだ C++11 をサポートしていない場合は、標準のアルゴリズムとファンクターを使用してベクターの内容を初期化できます。

class sig
{
public:
    sig()
    {
        struct Functor
        {
            Functor() : value(0) {};
            int operator ()() { return value++; };
            int value;
        };
        std::generate(p_list, p_list + 4, Functor());
    }

    int p_list[4];
};

前のスニペットの例はこちら.

はい、ちょっと醜いです(少なくとも、私には醜く見えます)、コンパイル時に作業を行いません。しかし、コンストラクターで必要な作業を行います。

他の種類の初期化 (偶数/奇数での初期化、ランダムな値での初期化、別の値での開始など) が必要な場合は、Functor を変更するだけでよく、これがこの醜いアプローチの唯一の利点です。

于 2012-09-13T12:29:09.063 に答える
1

-std=c++11 または -std=gnu++11 オプションを使用して、C++11 コンパイラを使用して、このように配列メンバーを初期化できます。

struct student {
        private :
                int marks[5];
        public :
                char name[30];
                int rollno;
                student(int arr[], const char *name, int rno):marks{arr[0], arr[1], arr[2], arr[3], arr[4]}{
                        strcpy(this->name, name);
                        this->rollno = rno;
                }
                void printInfo() {
                        cout <<"Name : "<<this->name<<endl;
                        cout <<"Roll No : "<<this->rollno<<endl;
                        for(int i=0; i< 5; i++ ) {
                                cout <<"marks : "<<marks[i]<<endl;
                        }
                }
};
int main(int argc, char *argv[]) {
        int arr[] = {40,50,55,60,46};
        //this dynamic array passing is possible in c++11 so use option -std=c++11
        struct student s1(new int[5]{40, 50, 55, 60, 46}, "Mayur", 56);
        //can't access the private variable
        //cout <<"Mark1 : "<<s1.marks[0]<<endl;
        s1.printInfo();`enter code here`
} 
于 2017-10-03T15:17:57.643 に答える
-3
p_list[4] = {'A', 'B', 'C', 'D'};
于 2012-07-23T10:05:35.500 に答える