开发者

How do I use member functions of constant arrays in C++?

Here is a simplified version of what I have (not working):

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;
}
...

When I try to build, I get the following error: error C2228: left of '.length' must have class/struct/union

The error occurs only when I try to use member functions of the c_astrExamples. If I replace "c_astrExamples.length()" with the number 2, everything appears to work correctly.

I am able to use the member functions of c_strExample1 and c_strExample2, so I think the behavior arises out of some difference b开发者_JAVA技巧etween my use of strings vs arrays of strings.

Is my initialization in prog.h wrong? Do I need something special in prog.cpp?


Arrays in C++ don't have member functions. You should use a collection like vector<string> if you want an object, or compute the length like this:

int nLength = sizeof(c_astrExamples)/sizeof(c_astrExamples[0]);


Just use STL vector of strings instead of array:

#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();


Arrays in C++ are inherited from C, which wasn't object-oriented. So they aren't objects and don't have member functions. (In that they behave like int, float and the other built-in types.) From that ancestry stem more problems with array, like the fact that they easily (e.g., when passed into a function) decay into a pointer to the first element with no size information left.

The usual advice is to use std::vector instead, which is a dynamically resizable array. However, if you the array size is known at compile-time and you need a constant, then boost's array type (boost::array, if your compiler supports the TR1 standard extensions also available as std::tr1::array, to become std::array in the next version of the C++ standard) is what you want.

Edit 1:

A safe way to get the length of an array in C++ involves an incredible combination of templates, function pointers and even a macro thrown into the mix:

template <typename T, std::size_t N>
char (&array_size_helper(T (&)[N]))[N];

#define ARRAY_SIZE(Array_) (sizeof( array_size_helper(Array_) ))

If you (like me) think this is hilarious, look at boost::array.

Edit 2:

As dribeas said in a comment, if you don't need a compile-time constant, this

template <typename T, std::size_t N>
inline std::size_t array_size(T(&)[N])
{return N;}

is sufficient (and much easier to read and understand).


c_astrExamples is an array, there is no "length()" method in it.


In C++ arrays are not objects and have no methods on it. If you need to get the length of the array you could use the following macro

#define COUNTOF( array ) ( sizeof( array )/sizeof( array[0] ) )
int nLength = COUNTOF(c_astrExamples);


Also, beware of initialisation in a header file. You risk offending the linker.
You should have:

prog.h:

extern const string c_strExample1;
extern const string c_strExample2;
extern const string c_astrExamples[];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜