免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9559 | 回复: 15
打印 上一主题 下一主题

[C++] [提问]C++继承模板类 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-04 01:13 |只看该作者 |倒序浏览
哪位高手讲讲继承模板类的用法吧,小弟在此感激不禁!!
程序是这样的,可以肯定是模板的问题,因为我去掉模板之后能够连接成功
//matrix.h
#ifndef _MATRIX_H
#define _MATRIX_H
#include<iostream>
#include<string>
#include<vector>
#include<exception>
using namespace std;


template<typename Elemtype>
class matrix
{
public:
        virtual ~matrix() {}

        void set_elem(int, int, const Elemtype &);

        Elemtype get_elem(int, int)const;

        const string& get_name()const
                { return _rname; }

        int get_dim()const { return _dim; }

protected:
        matrix(int dim, const string &name, vector<Elemtype> &relem):
                _dim(dim), _rname(name), _relem(relem) {};

        bool check(int row, int col)const
                { return row < _dim && col < _dim; }

        virtual int transform(int, int)const = 0;

        int _dim;
        const string &_rname;
        vector<Elemtype> &_relem;
};
#endif

论坛徽章:
0
2 [报告]
发表于 2005-11-04 01:14 |只看该作者
matrix类的定义
#ifndef _MATRIX_H
#include"matrix.h"
#endif

/* set_elem: set elements at position(row, col)  *
* if the position is invalid, do nothing        *
*/
template<typename Elemtype>
void matrix<Elemtype>::
set_elem(int row, int col, const Elemtype &elem)
{
         if (check(row, col) == true)
         {
                  int i = transform(row, col);
                  _relem[i] = elem;
                  return;
         }
         throw;
}

/* get_elem: get element at position(row, col) *
* if the position is invalid, do nothing      *
*/
template<typename Elemtype>
Elemtype matrix<Elemtype>::
get_elem(int row, int col)const
{
         if (check(row, col) == true)
         {
                  int i = transform(row, col);
                  return _relem[i];
         }
         throw;
}

论坛徽章:
0
3 [报告]
发表于 2005-11-04 01:16 |只看该作者
继承类symmetry
#ifndef _SYMMETRY_H
#define _SYMMETRY_H
#ifndef _MATRIX_H
#include"matrix.h"
#endif

template<typename Elemtype>
class symmetry : public matrix<Elemtype>
{
public:
        symmetry(const symmetry &rhs):
                matrix<Elemtype>(rhs._dim, _name, _elem),
                _elem(rhs._elem) {}

        symmetry(const vector<Elemtype> &rhs):
                matrix<Elemtype>(len_to_dim(rhs.size()), _name, _elem),
                _elem(rhs)        {        let_valid(); }

        virtual ~symmetry() {};

        //         virtual const symmetry& operator+ (symmetry &);
        //         virtual const symmetry& operator* (symmetry &);
        //         virtual symmetry& operator= (symmetry &);

private:
        int len_to_dim(int);

        static void swap(int&, int&);

        virtual int transform(int, int)const;

        void let_valid();

        static const string _name;
        vector<Elemtype> _elem;
        int _valid_pos;
};
#endif

论坛徽章:
0
4 [报告]
发表于 2005-11-04 01:16 |只看该作者
symmetry实现
#ifndef _SYMMETRY_H
#include"symmetry.h"
#endif

template<typename Elemtype>
const string symmetry<Elemtype>::
_name = "Symmetry Matrix";

template<typename Elemtype>
void symmetry<Elemtype>::
swap(int &x, int &y)
{
         int tmp;

         tmp = x;
         x = y;
         y = tmp;
}

template<typename Elemtype>
int symmetry<Elemtype>::
len_to_dim(int len)
{
         int sum = 0;

         pos = 0;
         for (int i = 1; i < len; i++)
         {
                  sum += i;
                  if (sum == len)
                           return i;
                  else if (sum > len)
                  {
                           pos = sum - len;
                           return i;
                  }
         }
}

template<typename Elemtype>
int symmetry<Elemtype>::
transform(int row, int col)const
{
         if (check(row, col) == true)
         {
                  if (col > row)
                           swap(row, col);
                  return row*(row+1)/2 + col;
         }
         return -1;
}

template<typename Elemtype>
void symmetry<Elemtype>::
let_valid()
{
         for (int i = 0; i < pos; i++)
                  _elem.push_back(0);
}

论坛徽章:
0
5 [报告]
发表于 2005-11-04 01:17 |只看该作者
测试程序:
#include<iostream>
#include<vector>
#include"symmetry.h"
#include"matrix.h"

using namespace std;

int main()
{
         int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

         vector<int> vec(array, array+10);
         symmetry<int> test(vec);
         matrix<int> *pm;
         pm = &test;
         cout << pm->get_elem(2, 2);
         return 0;
}

论坛徽章:
0
6 [报告]
发表于 2005-11-04 01:24 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2005-11-04 01:34 |只看该作者
原帖由 Yarco 于 2005-11-4 01:24 发表
使用模板, 声明和定义不能分开.
这就是为什么<string>而不是string.h的原因


如果我没记错的话,标准库中的声明和实现是分开的呀.
还有就是string.h和string的区别,string.h是C标准头文件,而string则是采用了命名空间的C++标准头文件,似乎和模板没太大关系

论坛徽章:
0
8 [报告]
发表于 2005-11-04 02:14 |只看该作者
把所有东西连成一片很省地方吗?

把类声明和类实现都放到头文件里面去

标准库里面的string也是用模板实现的。


  1. template<typename Elemtype>
  2. int symmetry<Elemtype>::
  3. len_to_dim(int len)
  4. {
  5.          int sum = 0;

  6. //         pos = 0;       //你的pos是在那里定义的?
  7.          _valid_pos = 0;
  8.          for (int i = 1; i < len; i++)
  9.          {
  10.                   sum += i;
  11.                   if (sum == len)
  12.                            return i;
  13.                   else if (sum > len)
  14.                   {
  15. //                           pos = sum - len;
  16.                            _valid_pos = sum - len;
  17.                            return i;
  18.                   }
  19.          }
  20. }

  21. template<typename Elemtype>
  22. int symmetry<Elemtype>::
  23. transform(int row, int col) const
  24. {
  25.     if (matrix<Elemtype>::check(row, col) == true) //这里显式指出
  26.     {
  27.         if (col > row)
  28.             swap(row, col);
  29.         return row*(row+1)/2 + col;
  30.     }
  31.     return -1;
  32. }

  33. template<typename Elemtype>
  34. void symmetry<Elemtype>::
  35. let_valid()
  36. {
  37.     for (int i = 0; i < _valid_pos; i++)
  38.         _elem.push_back(0);
  39. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2005-11-04 08:38 |只看该作者
看看export摸板声明看看

论坛徽章:
0
10 [报告]
发表于 2005-11-04 10:47 |只看该作者
原帖由 renstone921 于 2005-11-4 02:14 发表
把所有东西连成一片很省地方吗?

把类声明和类实现都放到头文件里面去

标准库里面的string也是用模板实现的。

[code]
template<typename Elemtype>
int symmetry<Elemtype>::
len_to_dim( ...


不好意思,我发贴的时候忘了改了.
我是先编译所有的.cpp文件最后再连接的,好像编译器根本没有看到这个函数,但在那个非模板的实现中检查出来了

我刚才修改了一下,仍然提示是找不到matrix::get_elem(int,int)const, symmetry::_name,
symmetry::len_to_dim(int), symmetry::let_valid()
模板太难了

[ 本帖最后由 SANFXUNIL 于 2005-11-4 11:09 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP