亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 9603 | 回復(fù): 15
打印 上一主題 下一主題

[C++] [提問(wèn)]C++繼承模板類 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2005-11-04 01:13 |只看該作者 |倒序?yàn)g覽
哪位高手講講繼承模板類的用法吧,小弟在此感激不禁!!
程序是這樣的,可以肯定是模板的問(wèn)題,因?yàn)槲胰サ裟0逯竽軌蜻B接成功
//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 [報(bào)告]
發(fā)表于 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 [報(bào)告]
發(fā)表于 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 [報(bào)告]
發(fā)表于 2005-11-04 01:16 |只看該作者
symmetry實(shí)現(xiàn)
#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 [報(bào)告]
發(fā)表于 2005-11-04 01:17 |只看該作者
測(cè)試程序:
#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 [報(bào)告]
發(fā)表于 2005-11-04 01:24 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2005-11-04 01:34 |只看該作者
原帖由 Yarco 于 2005-11-4 01:24 發(fā)表
使用模板, 聲明和定義不能分開(kāi).
這就是為什么<string>而不是string.h的原因


如果我沒(méi)記錯(cuò)的話,標(biāo)準(zhǔn)庫(kù)中的聲明和實(shí)現(xiàn)是分開(kāi)的呀.
還有就是string.h和string的區(qū)別,string.h是C標(biāo)準(zhǔn)頭文件,而string則是采用了命名空間的C++標(biāo)準(zhǔn)頭文件,似乎和模板沒(méi)太大關(guān)系

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2005-11-04 02:14 |只看該作者
把所有東西連成一片很省地方嗎?

把類聲明和類實(shí)現(xiàn)都放到頭文件里面去

標(biāo)準(zhǔn)庫(kù)里面的string也是用模板實(shí)現(xiàn)的。


  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. }
復(fù)制代碼

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2005-11-04 08:38 |只看該作者
看看export摸板聲明看看

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2005-11-04 10:47 |只看該作者
原帖由 renstone921 于 2005-11-4 02:14 發(fā)表
把所有東西連成一片很省地方嗎?

把類聲明和類實(shí)現(xiàn)都放到頭文件里面去

標(biāo)準(zhǔn)庫(kù)里面的string也是用模板實(shí)現(xiàn)的。

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


不好意思,我發(fā)貼的時(shí)候忘了改了.
我是先編譯所有的.cpp文件最后再連接的,好像編譯器根本沒(méi)有看到這個(gè)函數(shù),但在那個(gè)非模板的實(shí)現(xiàn)中檢查出來(lái)了

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

[ 本帖最后由 SANFXUNIL 于 2005-11-4 11:09 編輯 ]
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP