4

次のクラスについて考えてみます。

class A {
    const int arr[2];
public:
      A() { }
};

arrコンストラクタ初期化子リストから、または宣言されている行(つまり)以外の方法で初期化することは可能const int arr[2] = {1,2};ですか?

C++98で動作するメソッドに興味があることに注意してください。

4

3 に答える 3

4

それらをでラップすることによりstruct、例えば:

class A
{
    struct Data
    {
        int arr[2];
    };

    Data const arr;
public:
    A() : arr( someOtherStruct ) {}
};

これは、データにアクセスするには、を書き込む必要があることを意味しますarr.arrstruct:から継承することでそれを回避することが可能です。

struct PrivateDataForA
{
    int arr[2];
};

class A : private PrivateDataForA
{
public:
    A() : PrivateDataForA( someOtherStruct ) {}
};

structこれにより、クラスの外部に名前が表示されます(これは利点になる可能性があります。クライアントコードは引数として名前を渡すことができます)。

構造体のインスタンスが手元にない場合、たとえば、コンストラクターへの引数から計算された値で構造体を埋めたい場合は、静的メンバー関数を使用できます。

class A : private PrivateDataForA
{
    static PrivateDataForA createInitializer( int a, int b );
public:
    A( int a, int b ) : PrivateDataForA( createInitializer( a, b ) )
    {
    }
};

OPの具体例:

#include <iostream>
#include <stddef.h>

typedef ptrdiff_t   Size;
typedef Size        Index;

template< class Element, Size n >
struct Array{ Element elem[n]; };

class A {
    Array<int, 2> const arr_;       // const int arr[2];

    A& operator=( A const& );       // No such.

    static Array<int, 2> const& oneAndTwo()
    {
        static Array<int, 2> const a = {1, 2};
        return a;
    }

public:
    A(): arr_( oneAndTwo() ) {}
    int at( Index i ) const { return arr_.elem[i]; }
};


int main()
{
    using namespace std;

    A o;
    for( int i = 0;  i < 2;  ++i )
    {
        cout << o.at( i ) << endl;
    }
}
于 2011-11-17T18:20:57.133 に答える
2

配列要素をゼロ以外の値に初期化するには、C++11のサポートが必要です。

C ++ 03では、配列の値を初期化することしかできません。その結果、各要素の値は0次のようになります。

class A {
    const int arr[2];
public:
    A() : arr() { }
};

関連するC++03標準については、この質問と回答を参照してください。
メンバー初期化リストを使用して初期化するにはどうすればよいですか。

(C ++ 98とは、C ++ 11ではない、つまりC ++ 03が受け入れられることを意味すると仮定します。この仮定が間違っている場合は、そのように言ってください。)

于 2011-11-17T18:04:01.663 に答える
-2

いいえ、ちがいます。

于 2011-11-17T17:59:35.697 に答える