C ++で定数配列のメンバー関数を使用するにはどうすればよいですか?
質問
これは私が持っているものの簡単なバージョンです(動作していません):
prog.h:
...
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
const string c_astrExamples[] = {c_strExample1, c_strExample2};
...
prog.cpp:
...
int main()
{
int nLength = c_astrExamples.length();
for (int i = 0; i < nLength; i++)
cout << c_astrExamples[i] << "\n";
return 0;
}
...
ビルドしようとすると、次のエラーが表示されます。 エラーC2228: '.length'の左にはclass / struct / unionが必要です
エラーは、c_astrExamplesのメンバー関数を使用しようとしたときにのみ発生します。 <!> quot; c_astrExamples.length()<!> quot;を置き換える場合番号2では、すべてが正常に機能しているように見えます。
c_strExample1およびc_strExample2のメンバー関数を使用できるため、文字列の使用と文字列の配列の使用の違いから動作が生じると思います。
prog.hでの初期化は間違っていますか? prog.cppには特別なものが必要ですか?
解決
C ++の配列には、メンバー関数はありません。オブジェクトが必要な場合はvector<string>
のようなコレクションを使用するか、次のように長さを計算する必要があります。
int nLength = sizeof(c_astrExamples)/sizeof(c_astrExamples[0]);
他のヒント
配列の代わりに文字列の STLベクトルを使用するだけです:
#include <string>
#include <vector>
using namespace std;
const string c_strExample1 = "ex1";
const string c_strExample2 = "ex2";
vector<string> c_astrExamples;
c_astrExamples.push_back(c_strExample1);
c_astrExamples.push_back(c_strExample2);
int main()
{
int nLength = c_astrExamples.size();
C ++の配列は、オブジェクト指向ではなかったCから継承されます。したがって、これらはオブジェクトではなく、メンバー関数を持ちません。 (それらはint
、float
および他の組み込み型のように振る舞います。)その祖先から、配列に多くの問題が生じます。たとえば、関数に渡されると簡単にポインターになります。サイズ情報が残っていない最初の要素に。
通常のアドバイスは、代わりにstd::vector
を使用することです。これは、動的にサイズ変更可能な配列です。ただし、コンパイル時に配列サイズがわかっていて定数が必要な場合は、ブーストの配列タイプ(boost::array
、std::tr1::array
としても利用可能なTR1標準拡張をサポートしている場合、C ++標準の次のバージョンでstd::array
になる)欲しいです。
編集1 :
C ++で配列の長さを取得する安全な方法には、テンプレート、関数ポインター、さらにはミックスにスローされるマクロの信じられない組み合わせが含まれます:
template <typename T, std::size_t N>
char (&array_size_helper(T (&)[N]))[N];
#define ARRAY_SIZE(Array_) (sizeof( array_size_helper(Array_) ))
あなた(私のように)これが陽気なと思うなら、 <=> 。
編集2 :
dribeasがコメントで述べたように、コンパイル時の定数が必要ない場合、これ
template <typename T, std::size_t N>
inline std::size_t array_size(T(&)[N])
{return N;}
で十分です(読みやすく理解しやすいです)。
c_astrExamplesは配列です。<!> quot; length()<!> quot;はありません。メソッド。
C ++では、配列はオブジェクトではなく、メソッドを持ちません。配列の長さを取得する必要がある場合は、次のマクロを使用できます
#define COUNTOF( array ) ( sizeof( array )/sizeof( array[0] ) )
int nLength = COUNTOF(c_astrExamples);
また、ヘッダーファイルの初期化に注意してください。リンカーを怒らせる危険があります。
次のものが必要です。
prog.h:
extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];