在下面的代码,类A具有私有数据成员。我需要定义这样结构的阵列,共享类A的所有对象之间的整个阵列因此,我已经定义了一个指针,struct和初始化它的类的构造函数。
那么类的两个实例访问与自己抵消静态数组。
1 #include<iostream>
2 #include<cstdio>
3
4 using namespace std;
5
6 class A{
7
8 private:
9
10 struct data
11 {
12 int id;
13 };
14 struct data *str_offset;
15 public:
16 A();
17 static data* struct_ptr;
18
19 int get_next()
20 {
21 int tmp =str_offset->id;
22 str_offset ++;
23 return tmp;
24 }
25 void set_ptrs(int str)
26 {
27 str_offset = struct_ptr + str;
28 }
29 };
30
31 A::A()
32 {
33 struct_ptr = new A::data[100];
34
35 for (int i=0; i<100; i++)
36 {
37 struct_ptr->id = i;
38 struct_ptr++;
39 }
40 }
41
42 int main()
43 {
44 int size = 100;
45 int v1_st = 0;
46 int v2_st = 50;
47
48
49 A v1, v2;
50 v1.set_ptrs(v1_st);
51 v2.set_ptrs(v2_st);
52
53 for( int i = 0; i < 10; i++)
54 {
55 cout << "v1[" << i << "] = " << v1.get_next() << endl;
56 cout << "v2[" << i << "] = " << v2.get_next() << endl;
57 }
58
59 }
当我编译和链接代码,我得到这个错误:
/cache//ccz4iAcr.o: In function `A::A()':
static_test.cpp:(.text+0x19): undefined reference to `A::struct_ptr'
static_test.cpp:(.text+0x29): undefined reference to `A::struct_ptr'
static_test.cpp:(.text+0x35): undefined reference to `A::struct_ptr'
static_test.cpp:(.text+0x40): undefined reference to `A::struct_ptr'
/cache//ccz4iAcr.o: In function `A::set_ptrs(int)':
static_test.cpp:(.text._ZN1A8set_ptrsEi[_ZN1A8set_ptrsEi]+0xe):
undefined reference to `A::struct_ptr'
collect2: error: ld returned 1 exit status
我明白,我需要的地方定义静态成员的类之外。但是,随着它的类型是私有成员(并有保持私有的),我在这里,像卡住“A ::数据* struct_ptr;”不工作。
附:这是从在StackOverflow的其它问题,不同的静态数据成员的类型是定义为私有成员struct的。任何帮助,高度赞赏。
要定义变量使用:
A::data * A::struct_ptr = new data[100];
请注意这两个(第一)A::
和data
前struct_ptr
。如果你删除任何前缀,编译将会失败。随着两个前缀,它编译。
还要注意的是,如果你分配在构造函数中的数组,你有内存泄漏。你会在每次构造类型A
的对象时分配一个新的数组。
此外,您的构造函数中,它让struct_ptr
指向过去分配的数组的末尾元素的问题。后来访问struct_ptr
,如果它是指向数组的开始。这是行不通的。
另一种选择是str_ptr
改变一个函数,并把静态变量在那里。这可能是这样的:
A::data * A::str_ptr()
{
static data * const array = new data[100];
return array;
}
这或许可以取决于你如何真正需要使用该指针得到改善。这可能是方便在索引中通过,并有功能指数在返回的元素。
您可能还需要定义体现了数据的阵列中的类,以便它可以采取的初始化工作。这样,你没有发生多次初始化,您不必跟踪如果你初始化任何东西。 (在最起码,限定所述指针作为const
防止被改变到一个意想不到的值它的值)。
你不能从类外部访问私有声明的类型,甚至在一些CPP-文件的文件范围内没有。
为了克服这个问题,你可以声明该类型的类以外(但有它一定程度上封装,在CPP文件定义它):
// header file
class A{
private:
struct data *str_offset;
public:
A();
static data* struct_ptr;
};
// cpp-file:
struct data
{
int id;
};
data * A::struct_ptr = new data[100];
A::A() {
str_offset = struct_ptr++;
str_offset->id = 10;
}