| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2956 人关注过本帖
标题:谁知道在c++中怎么在模板中使用静态变量啊?
只看楼主 加入收藏
玉琪龙
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-12-9
收藏
 问题点数:0 回复次数:13 
谁知道在c++中怎么在模板中使用静态变量啊?
在学到c++模板时,忽然想到静态变量,于是试一下,但是出不了结果,不知道使用时有什么规则?请哪位高手指教一下!!
谢谢~~~~~
搜索更多相关主题的帖子: 十分感激 
2007-12-09 11:55
玉琪龙
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-12-9
收藏
得分:0 
具体点吧!大家看看这是怎么错的?
#include<iostream.h>
template <class T>
class Fun
{int l;T *p;
static T sum;
public:
Fun(int i=1)
{ l=i;
p=new T[i];
}
void input();
void output();
void sort();
void look(T);
 void add()
 {
    for(int i=0;i<l;i++)
       sum+=p[i];

 }
 ~Fun(){delete [] p;}
};
T static::sum=0;
4template <class T>
void Fun<T>::input()
{ for(int i=0;i<l;i++)
{ cout<<"请输入第"<<i+1<<"个数据:";
    cin>>p[i];
}
}
template <class T>
void Fun<T>::output()
{for(int i=0;i<l;i++)
  cout<<p[i]<<' ';
}
template <class T>
void Fun<T>::sort()
{T tem;
 for(int i=0;i<l-1;i++)
  for(int j=i+1;j<l;j++)
      if(p[i]>p[j])
      {tem=p[i];
       p[i]=p[j];
       p[j]=tem;
      }
}
template <class T>
void Fun<T>::look(T key)
{for(int i=0;i<l;i++)
  if(p[i]!=key)continue;
  else cout<<"您要的数据在第"<<i+1<<"个";
cout<<"抱歉~您要的数据没有查询到!请从新输入:";
}
void main()
{Fun<int> s(4);int key;
 cout<<"请输入数据:";
 cout<<endl;
 s.input();cout<<endl;
 cout<<"确认您的数据为:";
 s.output();cout<<endl;
 cout<<"对您的数据排序后结果:";
 s.sort();
 s.output();cout<<endl;
 cout<<"请输入您要查询的数据:";
 cin>>key;
 s.look(key);
}
谢谢啊很多 麻烦大家啦

龙的图腾
2007-12-10 22:21
a19870502
Rank: 1
等 级:新手上路
帖 子:114
专家分:0
注 册:2007-10-31
收藏
得分:0 
我也不大清楚,但是把T static::sum=0;这句变成int sum=0;编译的时候就没有提示错误了。~~~
2007-12-11 13:30
玉琪龙
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-12-9
收藏
得分:0 
谢谢楼上的朋友啊!我上面的程序写的有点问题~~~不好意思
#include<iostream.h>
template <class T>
class Fun
{int l;T *p;
static T sum;
public:
Fun(int i=1)
{ l=i;
p=new T[i];
}
void input();
void output();
void sort();
void look(T);
 void add()
 {
    for(int i=0;i<l;i++)
       sum+=p[i];

 }
 ~Fun(){delete [] p;}
};
T  Fun::sum=0;
template <class T>
void Fun<T>::input()
{ for(int i=0;i<l;i++)
{ cout<<"请输入第"<<i+1<<"个数据:";
    cin>>p[i];
}
}
template <class T>
void Fun<T>::output()
{for(int i=0;i<l;i++)
  cout<<p[i]<<' ';
}
template <class T>
void Fun<T>::sort()
{T tem;
 for(int i=0;i<l-1;i++)
  for(int j=i+1;j<l;j++)
      if(p[i]>p[j])
      {tem=p[i];
       p[i]=p[j];
       p[j]=tem;
      }
}
template <class T>
void Fun<T>::look(T key)
{int k=-1;
    for(int i=0;i<l;i++)
    if(p[i]==key) k=i;
    if(k!=-1) cout<<"您要的数据在第"<<k+1<<"个";
    else cout<<"抱歉~您要的数据没有查询到!请从新输入:";
}
void main()
{Fun<int> s(4);int key;
 cout<<"请输入数据:";
 cout<<endl;
 s.input();cout<<endl;
 cout<<"确认您的数据为:";
 s.output();cout<<endl;
 cout<<"对您的数据排序后结果:";
 s.sort();
 s.output();cout<<endl;
 cout<<"请输入您要查询的数据:";
 cin>>key;
 s.look(key);
}
请高手们在看看啊!~~~多谢啊

龙的图腾
2007-12-12 12:53
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
程序代码:
#include <iostream>
using namespace std;

class A{
public:
    A(int n):v2(n){}
    static int v1;
    const int v2;
    static const int v3=3;
};

int A::v1=1;

int main(){
    printf("%d",sizeof(A));
    getchar();
}
请看这个例子。运行结果是4,也就是说,只有一个成员是属于对象的,是哪一个呢?是v2!其实编译时,所有的静态变量都是在静态变量区定义的。虽然v2是常量,但是也是要占内存空间的,这其实就是C++里面常量和C里面的预处理符号常量的最大区别:C的符号常量是不占内存空间的……
那么如果使用模板怎么办呢?
程序代码:
#include <iostream>
using namespace std;

template<class T>
class A{
public:
    A(T n):v2(n){}
    static T v1;
    const T v2;
    static const T v3=3;
};

template<class T>
T A<T>::v1=1;

int main(){
    printf("%d",sizeof(A<int>));
    getchar();
}
请注意代码的变化。模板类是在每一次实例化的时候编译的,换句话说,如果代码里面没有用到模板类,那么类里面的语法错误就永远不会被发现。
还有,大家可以吧A<int>换成A<float>看看是什么结果。嘿嘿~~~
静态/常量变量和模板都是比较难理解的概念。静态/常量变量掌握变量的内存布局就不会出错了,而模板则需要仔细分析程序的语法结构才能正确使用。

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-12 20:09
玉琪龙
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-12-9
收藏
得分:0 
谢谢这位仁兄啊 ~~~~·终于解决了!
还是现代人思维活跃啊 ~~~~我问老师,他们都说没见过!
呵呵呵…………

龙的图腾
2007-12-13 21:23
玉琪龙
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-12-9
收藏
得分:0 
请再指教一下啊~~~~~
那你怎么在你上面写的程序中,怎么在主函数中用那个静态变量呢?
#include <iostream>
using namespace std;

template<class T>
class A{
public:
    A(T n):v2(n){}
    static T v1;
    const T v2;
    static const T v3;
};

template<class T>
T A<T>::v1=1;
template<class T>
T A<T>::v3=1;
int main(){
    A<int> a(10);
    cout<<"v2="<<a.v2<<endl;
    cout<<"v3="<<A::v3;//这个v3怎么用啊?
  printf("%d",sizeof(A<int>));
    getchar();
}

龙的图腾
2007-12-13 22:49
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
首先要明白一个观点,也就是变量的所有权的问题。一个类的成员变量总是属于该类的对象的。但并不是所有的成员变量都是属于这个类的,事实上只有一种成员变量(或函数)是属于类的,也就是静态成员变量(函数)。
在这个问题上,我表示抱歉,我在上面说:“也就是说,只有一个成员是属于对象的”。其实这种说法是不科学的,因为那三个变量都是属于对象的。应该说“只有一个成员是对象的一部分”。属于和由什么组成是两个概念。这支钢笔是属于我的,但是钢笔显然不是长在我的身上的!
所以一方面v3可以这么用:
a.v3
但是,static声明的变量不止是属于对象的,还是属于这个类的,所以V3和V1还可以这么用
A::V3//v1是一样的
慢着!编译出错了!
原来,A是模板类,永远记住,模板类是需要模板参数的,于是改成如下的语法:
A<int>::V3
这里要注意,因为V3是在类里面直接赋值的,所以这里类型声明只能是整型(char,short,int,long)否则会出编译错误,其实正因为V3是在类里面直接赋值的,而且又是只读的,所以模板参数也是无所谓的。
还有要说的是,你写的代码中V3的初始化的方法是错误的。记住,static必须在类外初始化,const必须在构造函数初始化表初始化,static const可以在类的外面也可以在里面初始化,但是要带上const修饰符。把这三种情况当作公式背下来就不会再出错了。

[[italic] 本帖最后由 StarWing83 于 2007-12-14 13:33 编辑 [/italic]]

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-13 23:53
玉琪龙
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2007-12-9
收藏
得分:0 
先谢谢这位仁兄啊!
首先,七楼的那个程序是复制你的,我只是简单的改动一下,在机子上运行是没有错误的。
另外,“static const必须在声明的时候就初始化”我不知对不对,但是,我在c++6.0
运行时老是编译错误~~但是,改成“template<class T>
T A<T>::v3=1;
”之后就能通过编译!并且结果正确。
最后十分感谢您啊~~~就剩一个问题了,就是上面的那一个"static const"问题。

龙的图腾
2007-12-14 13:10
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
这个可能是编译器的问题吧。我用的VC++2005……VC6对C++的标准实现不好……还有,就是static const是可以在里面也可以在外面声明的,但是如果在外面,就必须这么写:
template<class T>
const T A<T>::v3=1;

因为V3是个常量变量……我昨天编译失败就是这个原因,这样就不会出问题了。记住,VC6对C++的实现是不完整的。这里再引用《C++ Primer》里面的一段话:


Ordinarily, class static members, like ordinary data members, cannot be initialized in the class body. Instead, static data members are normally initialized when they are defined.

One exception to this rule is that a const static data member of integral type can be initialized within the class body as long as the initializer is a constant expression:
      class Account {
      public:
          static double rate() { return interestRate; }
          static void rate(double);   // sets a new rate
      private:
          static const int period = 30; // interest posted every 30 days   这里,static const可以直接在类内部定义,其余情况都必须在外部实现,另外,static成员的定义必须放在CPP文件中,防止重复声明
          double daily_tbl[period]; // ok: period is constant expression
      };

A const static data member of integral type initialized with a constant value is a constant expression. As such, it can be used where a constant expression is
required, such as to specify the dimension for the array member daily_tbl.

When a const static data member is initialized in the class body, the data member must still be defined outside the class definition.
When an initializer is provided inside the class, the definition of the member must not specify an initial value:
      // definition of static member with no initializer;
      // the initial value is specified inside the class definition
      const int Account::period;

专心编程………
飞燕算法初级群:3996098
我的Blog
2007-12-14 13:31
快速回复:谁知道在c++中怎么在模板中使用静态变量啊?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013153 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved