首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++静态成员变量的初始化及应用.大神

2013-12-11 
C++静态成员变量的初始化及应用...求助大神大神们路过麻烦解决小弟的问题啦,关于模版类静态成员变量的使用

C++静态成员变量的初始化及应用...求助大神
大神们路过麻烦解决小弟的问题啦,关于模版类静态成员变量的使用~小弟头痛了一个早上啦!希望大神们能够解决这个麻烦啊~什么建议都接受的

/*对数组进行排序、求最大值和求元素和的函数采用静态成员函数的方式封装成数组算法类模板ArrayAlg,并采用相关数据进行测试。*/
#include <iostream>

using namespace std;

template <typename T,int n>
class ArrayAlg{

static T Array[n];
public :
ArrayAlg(T * temp);
static void Array_array();
static T Array_max();
static T Total();
static void print();
};

template <typename T,int n>
ArrayAlg<T , n>::ArrayAlg(T * temp)//初始化
{
for(int i = 0; i < n; i ++)
Array[i] = temp[i];
}


template <typename T ,int n>
T ArrayAlg<T , n>::Array_max()
{
T max = Array[0];
for(int i = 0 ; i < n ; i ++)
if(Array[i] > max)
max = Array[i];

return max;
}

template <typename T ,int n>
T ArrayAlg<T , n>::Total ()
{
T temp = Array[0];
for(int i = 1;i < n ; i ++)
temp = temp + Array[i];

return temp;
}

template <typename T,int n>
void ArrayAlg<T ,n>::Array_array()//排序
{
T temp;
for(int i = 0 ; i < n ; i ++)
for(int j = 0; j < i; j++)
{
if(Array[j] > Array[j+1])
{
temp = Array[j];
Array[j] = Array[j+1];
Array[j+1] = temp;
}
}
}

template <typename T,int n>
void ArrayAlg<T ,n>::print()
{
for(int i = 0; i < n; i++)
cout << Array[i] << " " << endl;
}
void main()
{
int Int_Array[5] = {4,1,3,2,6};

ArrayAlg<int,5> Test_Array(Int_Array);

cout << "The max is : "<< Test_Array.Array_max() << endl;
cout << "The total is : "<< Test_Array.Total () << endl;
Test_Array.Array_array ();
Test_Array.print ();

}

/*
错误提示
5_5.obj : error LNK2001: 无法解析的外部符号 "private: static int * ArrayAlg<int,5>::Array" (?Array@?$ArrayAlg@H$04@@0PAHA)
*/

[解决办法]
静态成员需要显示初始化,即使模板也不例外。加入以下内容就可以了:

template<>//模板特化
int ArrayAlg<int,5>::Array[5];

[解决办法]
static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。
静态成员不能在类定义里边初始化,只能在class body外初始化。
静态成员仍然遵循public,private,protected访问准则。
静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用。

这个就是用法
引用:
静态成员需要显示初始化,即使模板也不例外。加入以下内容就可以了:

template<>//模板特化
int ArrayAlg<int,5>::Array[5];

[解决办法]
class foo
{
    static const int a = 0;
};

上面说的对,静态成员别用构造函数初始化啊……得在类的外部显示初始化,但是静态常量好像可以在类内部初始化。

热点排行