我可以用以下方式在c ++中使用数组作为类的成员变量吗?或者我应该将它声明为指针?以下代码工作正常。这样做是否正确? (我为了简单而公开了)。我也不确定我是否正确使用地图。
#include <iostream>
#include <map>
#include <string.h>
using namespace std;
class SimpleMap{
public:
map<string,int> m;
int i;
int j[];
SimpleMap(int ii);
};
SimpleMap::SimpleMap(int ii){
i = ii;
}
int main(){
SimpleMap mm(5);
mm.m["one"] = 1;
cout<<"hi hru";
cout<<mm.m["one"];
mm.j[0] = 11;
cout << mm.j[0];
}
编辑:我添加了地图成员变量。
答案 0 :(得分:5)
实际上,你已经有了一个指针。但它没有初始化。
设置j[0]
在某些情况下会起作用,当然,但是您要写入未分配的内存,或者更糟糕的是,写入另一个对象使用的内存。基本上你在你的应用程序中创建了一个巨大的漏洞。
考虑使用std::vector
,它只是为您完成所有分配/解除分配。如果这不是一个选项,至少初始化数组并且不要超过你的分配。
j[]
只是*j
,它只是指向随机存储器地址的指针。非常非常非常糟糕。
答案 1 :(得分:3)
int j[];
不是你的想法。这实际上定义了一个指针:int* j;
,它未被初始化,并且您正在从中读取未初始化状态,这是未定义的行为,又名错误。
只需使用std::vector
。
答案 2 :(得分:0)
不,我认为在你的声明初始化数组时会使用int j[];
。你应该提供数组的上限。我认为这是正确的int j[]={3,2,1};
。
答案 3 :(得分:0)
正如我在Google上发现的那样,我想在答案中消除混乱:使用T name[]
作为结构的最后一个成员称为“弹性数组成员”,并定义为对C的扩展,由例如GCC和Clang。使用示例:
struct Array{
int len;
float ar[];
};
// Create
Array* foo = malloc(sizeof(Array) + 100 * sizeof(float));
foo.len = 100;
// Use
for(int i=0; i<foo.len; i++) foo.ar[i] = i * M_PI;
特殊成员实际上不是成员,而是一些编译器魔术师,类似于struct Array{ int len; float ar[100]; };
,但您可以在运行时选择大小。
但是,在C ++中,这很难使用,因为您需要考虑对象寿命。因此,请勿在C ++中按原样使用。
对于OP:您可能想要一个真正的指针,并需要为所指向的数组分配内存。显然,std::vector
可以解决已经指出的大多数问题。