类型的私人数据成员的静态成员

问题描述 投票:2回答:2

在下面的代码,类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的。任何帮助,高度赞赏。

c++ linker-errors static-members
2个回答
3
投票

要定义变量使用:

A::data * A::struct_ptr = new data[100];

请注意这两个(第一)A::datastruct_ptr。如果你删除任何前缀,编译将会失败。随着两个前缀,它编译。

还要注意的是,如果你分配在构造函数中的数组,你有内存泄漏。你会在每次构造类型A的对象时分配一个新的数组。

此外,您的构造函数中,它让struct_ptr指向过去分配的数组的末尾元素的问题。后来访问struct_ptr,如果它是指向数组的开始。这是行不通的。


另一种选择是str_ptr改变一个函数,并把静态变量在那里。这可能是这样的:

A::data * A::str_ptr()
{
    static data * const array = new data[100];
    return array;
}

这或许可以取决于你如何真正需要使用该指针得到改善。这可能是方便在索引中通过,并有功能指数在返回的元素。

您可能还需要定义体现了数据的阵列中的类,以便它可以采取的初始化工作。这样,你没有发生多次初始化,您不必跟踪如果你初始化任何东西。 (在最起码,限定所述指针作为const防止被改变到一个意想不到的值它的值)。


0
投票

你不能从类外部访问私有声明的类型,甚至在一些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;
}
© www.soinside.com 2019 - 2024. All rights reserved.