Board logo

标题: 学生有一段程序不太懂,关于info2 prati.请教拉 [打印本页]

作者: dalian    时间: 2005-6-7 22:22     标题: 学生有一段程序不太懂,关于info2 prati.请教拉

#include <list>
using namespace std;

// Oberklasse LazyAktion
template <class T>
class LazyAktion
{
   public:
           LazyAktion( list<T>* ptLazyListe )
                  : p_ptLazyListe( ptLazyListe ) {}
      virtual ~LazyAktion() {}
      virtual void vAusfuehren() = 0;
   protected:
      list<T>*        p_ptLazyListe;        // Zeiger auf p_ListeObjekte
};


// LazyPushFront
template <class T>
class LazyPushFront : public LazyAktion<T>
{
   public:
      LazyPushFront(const T& einObjekt, list<T>* eineListe)
                      : LazyAktion<T>(eineListe)
                      , p_tObjekt(einObjekt) {}
      virtual ~LazyPushFront() {}
      void vAusfuehren() { p_ptLazyListe->push_front(p_tObjekt); }
   private:
      T        p_tObjekt;
};
看这一段  LazyAktion( list<T>* ptLazyListe )
                  : p_ptLazyListe( ptLazyListe ) {}相当于 { p_ptLazyListe= ptLazyListe}
p_ptLazyListe( ptLazyListe ) 这是什么玩意儿阿,变态老师让我们填写这个类定义,上面是他写的部分,我害怕有这种初始化方式,到底这可行吗?谢谢啦
作者: dalian    时间: 2005-6-7 22:24

并没有定义这个函数,老师怎马能这么胡写啊?
作者: weibinz    时间: 2005-6-7 22:26

那就是初始化表,楼主理解的很对
作者: jackypx    时间: 2005-6-7 22:26

有个新闻组专门是讨论info2 Praktikum的,不过申请好麻烦,你可以去ET的fachschaft网站上看看,有详细地说明,另外要用亚琛大学的邮箱注册。
作者: dalian    时间: 2005-6-7 22:34

#ifndef __LazyAktion_h
#define __LazyAktion_h

#include <list>
using namespace std;

// Oberklasse LazyAktion
template <class T>
class LazyAktion
{
   public:
      LazyAktion( list<T>* ptLazyListe )
          {
                  p_ptLazyListe=ptLazyListe;
          }
      virtual ~LazyAktion() {}
      virtual void vAusfuehren() = 0;
   protected:
      list<T>*        p_ptLazyListe;        // Zeiger auf p_ListeObjekte
};


// LazyPushFront
template <class T>
class LazyPushFront : public LazyAktion<T>
{
   public:
      LazyPushFront(const T& einObjekt, list<T>* eineListe)
                      : LazyAktion<T>(eineListe)
          {
                  p_tObjekt=einObjekt;
          }
      virtual ~LazyPushFront() {}
      void vAusfuehren() { p_ptLazyListe->push_front(p_tObjekt); }
   private:
      T        p_tObjekt;
};

我这么写吧,由他去吧,老是这种写法看不懂,算了
作者: weibinz    时间: 2005-6-7 22:36

我也觉得这样写,很清楚,易懂。
初始化表很:(
作者: 反方向的钟    时间: 2005-6-7 22:40

Originally posted by dalian at 2005-6-7 23:22:
#include <list>
using namespace std;

// Oberklasse LazyAktion
template <class T>
class LazyAktion
{
   public:
           LazyAktion( list<T>* ptLazyListe )
                  : p_ptLazyListe ...

这么写没什么问题啊?很明显,ptLazyliste是你指向的外部的一个已经存在的list对象,利用这个构造函数把它传给了LazyAktion的内部保护变量p_ptLazyListe以供LazyAktion自己来调用这个列表对象,逻辑上没有任何问题啊。
另外你是大连的吧,;);)
作者: STROM    时间: 2005-6-7 22:41

Originally posted by 反方向的钟 at 2005-6-7 11:40 PM:

这么写没什么问题啊?很明显,ptLazyliste是你指向的外部的一个已经存在的list对象,利用这个构造函数把它传给了LazyAktion的内部保护变量p_ptLazyListe以供LazyAktion自己来调用这个列表对象,逻辑上没有任何问 ...

专业的就是不一样yes.gif:
作者: 反方向的钟    时间: 2005-6-7 22:46

另外,你的后来的写法其实和老师的有不同的,你是直接将指针赋值。而老师是把p_ptLazyListe看作一个类(list<T>类)的实例调用这个类(list<T>类)的有参数的构造函数(ptLazyListe作为参数)来得到p_ptLazyListe的。
作者: 孩儿他大表舅    时间: 2005-6-7 22:47

你们探讨完了有了结果,我明天去问你们,哈哈。大连你肚子不疼了?
作者: oasisangel    时间: 2005-6-7 22:51

Originally posted by 反方向的钟 at 7/6/05 22:40:

这么写没什么问题啊?很明显,ptLazyliste是你指向的外部的一个已经存在的list对象,利用这个构造函数把它传给了LazyAktion的内部保护变量p_ptLazyListe以供LazyAktion自己来调用这个列表对象,逻辑上没有任何问 ...


内部消息不是大连的,是大连:P
作者: 版主    时间: 2005-6-7 22:53

dozingoff.
作者: dalian    时间: 2005-6-7 22:53

hehe ,今天没事了,关键是没发烧,欧就放心了
作者: dalian    时间: 2005-6-7 22:56

赫赫,困了。大家都还没睡。都挺强的,呵呵,哥们撑不住了,先睡了
作者: oasisangel    时间: 2005-6-7 22:57

Originally posted by dalian at 7/6/05 22:53:
hehe ,今天没事了,关键是没发烧,就放心了


:D
作者: dalian    时间: 2005-6-7 23:12

呵呵
作者: 驴子    时间: 2005-6-7 23:59

给你个例子
a.h

Class A
{
public:
void A(int a)
  :age(a)
{}

private:

int age;
}
作者: 驴子    时间: 2005-6-8 00:18

上面那段代码和下面这段是等效的
Class A
{
public:
void A(int a)
{
    age = a;
}

private:

int age;
}
作者: 驴子    时间: 2005-6-8 00:33

void A(int a)
  :age(a)
是一种初始化的方式,这种方式只能用于一个类的构造函数
一般是在“:”后面先跟父类的构造函数,然后跟“,”接下来就是自己的成员变量的初始化
格式是    成员变量(初始化值),几个成员变量的初始化之间用“;”分隔

例如

a.h

Class A
{
public:
void A(int a)
  :age(a)
{}

private:

int age;
}


b.h

Class B : public A
{
public:
void B(int a, double b, double h=175)
:A(a),
weight(b),
height(h)
{}

private:

double weight;
double height;
}

需要注意的是double h=175,这种方式是当你对一个B的变量初始化时,只输入了2个参数,这个时候height会取默认值175
例如

B* dalian;
dalian = new B(18,100,150);  // 这句表示dalian年方18,体重100kg,身高150cm
delete dalian;
dalian = new B(18,100); // 这句由于没给身高,所以身高在初始化的时候会取默认值175cm

注意:有默认值的参数必须放在参数列表的最后。

B::B(int a, double height = 175, double weight)

上面这样是错误的

[ Last edited by 驴子 on 2005-6-8 at 12:54 ]
作者: dalian    时间: 2005-6-8 16:29

有理,c++要学的东西太多了




欢迎光临 人在德国 社区 (http://csuchen.de/bbs/) Powered by Discuz! 7.2