如何在C ++中使用常量数组的成员函数?

时间:2009-10-28 19:04:10

标签: c++ arrays constants

以下是我所拥有(不工作)的简化版本:

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的成员函数时才会发生错误。 如果我用数字2替换“c_astrExamples.length()”,一切似乎都能正常工作。

我能够使用c_strExample1和c_strExample2的成员函数,所以我认为这种行为源于我使用字符串与字符串数组之间的一些区别。

我在prog.h中的初始化是错误的吗?在prog.cpp中我需要一些特别的东西吗?

6 个答案:

答案 0 :(得分:6)

C ++中的数组没有成员函数。如果你想要一个对象,你应该使用像vector<string>这样的集合,或者像这样计算长度:

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

答案 1 :(得分:2)

C ++中的数组是从C继承的,而C不是面向对象的。所以它们不是对象,也没有成员函数。 (因为它们的行为类似于intfloat和其他内置类型。)从那个祖先来看,更多的数组问题,比如它们很容易(例如,当传递给函数时)衰减成指向没有大小信息的第一个元素的指针。

通常的建议是使用std::vector代替,这是一个动态可调整大小的数组。但是,如果您在编译时已知数组大小并且需要常量,那么boost's array typeboost::array,如果您的编译器支持TR1标准扩展,也可以std::tr1::array,在下一版本的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_) ))

如果你(像我一样)认为这很有趣,请看boost::array

编辑2

正如dribeas在评论中所说,如果你不需要编译时常量,那么

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

足够(并且更容易阅读和理解)。

答案 2 :(得分:2)

只需使用STL vector字符串而不是数组:

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

答案 3 :(得分:0)

c_astrExamples是一个数组,其中没有“length()”方法。

答案 4 :(得分:0)

在C ++中,数组不是对象,也没有方法。如果需要获取数组的长度,可以使用以下宏

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

答案 5 :(得分:-1)

另外,请注意头文件中的初始化。您冒着冒犯链接器的风险 你应该:

prog.h:

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