次のクラスについて考えてみます。
class A {
const int arr[2];
public:
A() { }
};
arr
コンストラクタ初期化子リストから、または宣言されている行(つまり)以外の方法で初期化することは可能const int arr[2] = {1,2};
ですか?
C++98で動作するメソッドに興味があることに注意してください。
それらをでラップすることによりstruct
、例えば:
class A
{
struct Data
{
int arr[2];
};
Data const arr;
public:
A() : arr( someOtherStruct ) {}
};
これは、データにアクセスするには、を書き込む必要があることを意味しますarr.arr
。struct
:から継承することでそれを回避することが可能です。
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;
}
}
配列要素をゼロ以外の値に初期化するには、C++11のサポートが必要です。
C ++ 03では、配列の値を初期化することしかできません。その結果、各要素の値は0
次のようになります。
class A {
const int arr[2];
public:
A() : arr() { }
};
関連するC++03標準については、この質問と回答を参照してください。
メンバー初期化リストを使用して初期化するにはどうすればよいですか。
(C ++ 98とは、C ++ 11ではない、つまりC ++ 03が受け入れられることを意味すると仮定します。この仮定が間違っている場合は、そのように言ってください。)
いいえ、ちがいます。