小軒軒:我其實不太喜歡用那些別人的頭文件,但是沒辦法,现在的頭文件沒有想象中的那麽簡單。從我寫第一個頭文件stack.h以後,就感覺到,用自己寫的頭文件有一種奇妙的感覺哩。
小佳佳:是什麽呢?
小軒軒:是熟悉。我在用別人頭文件的時候有一種苦惱,就是不能完全匹配函數的變量。而自己要寫,就可以寫自己想要的,不合適就改,嘻嘻。
小軒軒:我們第一天學編程老師都喜歡獎講一個叫做Hello World的程序,就是這個啦。
#define _________ }
#define ________ putchar
#define _______ main
#define _(a) ________(a);
#define ______ _______(){
#define __ ______ _(0x48)_(0x65)_(0x6C)_(0x6C)
#define ___ _(0x6F)_(0x2C)_(0x20)_(0x77)_(0x6F)
#define ____ _(0x72)_(0x6C)_(0x64)_(0x21)
#define _____ __ ___ ____ _________
#include<stdio.h> _____
#ifndef OS_H
#define OS_H
#include <stdio.h>
namespace std{
class ostream{
public:
void flush() { if(stdout) fflush(stdout); }
const __cdecl ostream& operator << (int value) const;
const __cdecl ostream& operator << (char ch) const;
const __cdecl ostream& operator << (double value) const;
const __cdecl ostream& operator << (char const * str) const;
const __cdecl ostream& operator << (char * str) const;
const __cdecl ostream& operator << (void * p) const;
};
const __cdecl ostream& ostream::operator << (int value) const
{
printf("%d", value);
return *this;
}
const __cdecl ostream& ostream::operator << (char ch) const
{
printf("%c", ch);
return *this;
}
const __cdecl ostream& ostream::operator << (double value) const
{
printf("%g", value);
return *this;
}
const __cdecl ostream& ostream::operator << (char const * str) const
{
printf("%s", str);
return *this;
}
const __cdecl ostream& ostream::operator << (char * str) const
{
printf("%s", str);
return *this;
}
const __cdecl ostream& ostream::operator << (void * p) const
{
printf("0x%x", p);
return *this;
}
ostream cout;
ostream& __cdecl flush(ostream& i) {i.flush(); return(i);}
char const * endl = "\n";
}
#endif
小軒軒:於是我就可以#include "os.h"來輸出了。不過我寫的std::endl很水啦,就是一個"\n"的字符串常量。
小佳佳:這也可以。。。
小軒軒:我有時候啊,在網上給別人改程序,就會很不情願。看到他們各種不標準, 例如還出現iostream.h啦,就很明顯不好的習慣嘛。還有成員函數還不在構造函數初始化列表裏面聲明。我就會好生氣。
小佳佳:你幹嘛追求那麽標準?
小軒軒:其實是因爲我在學習的時候遇到好多system dependent的問題。vc7運行的好好的,vc6.0就不行。當然確實有標準庫的問題啦,比如std::size_t用的時候vc6.0偏說size_t is not a member of std。。。於是我索性打開vc6.0的<cstddef>頭文件自己寫上了
#ifndef _CSTDDEF_
#define _CSTDDEF_
#include <stddef.h>
namespace std {
using ::size_t;
}
#endif /* _CSTDDEF_ */它立時不叫喚了。
小佳佳:你一高興又説離話題了
小軒軒:哈哈。有一個類的例子,我覺得特別好,雖然它做的只是簡單的工作,但是用的方法真的把我追求的純凈C++相符了。 #include <iostream>
class Sieve
{
public:
virtual int NextNumber () = 0;
};
class SourceSieve: public Sieve
{
public:
SourceSieve () : _i (2) {}
int NextNumber ();
private:
int _i;
};
class Sieve2: public Sieve
{
public:
Sieve2 (Sieve & src) : _src (src) {}
int NextNumber ();
private:
Sieve & _src;
};
class Sieve3: public Sieve
{
public:
Sieve3 (Sieve & src) : _src (src) {}
int NextNumber ();
private:
Sieve & _src;
};
class Sieve5: public Sieve
{
public:
Sieve5 (Sieve & src) : _src (src) {}
int NextNumber ();
private:
Sieve & _src;
};
class Sieve7: public Sieve
{
public:
Sieve7 (Sieve & src) : _src (src) {}
int NextNumber ();
private:
Sieve & _src;
};
int SourceSieve::NextNumber ()
{
if (_i > 100)
return -1; // end
return _i++;
}
int Sieve2::NextNumber ()
{
int i;
do
{
i = _src.NextNumber ();
} while (i % 2 == 0 && i != 2 && i != -1);
return i;
}
int Sieve3::NextNumber ()
{
int i;
do
{
i = _src.NextNumber ();
} while (i % 3 == 0 && i != 3 && i != -1);
return i;
}
int Sieve5::NextNumber ()
{
int i;
do
{
i = _src.NextNumber ();
} while (i % 5 == 0 && i != 5 && i != -1);
return i;
}
int Sieve7::NextNumber ()
{
int i;
do
{
i = _src.NextNumber ();
} while (i % 7 == 0 && i != 7 && i != -1);
return i;
}
int main ()
{
SourceSieve src;
Sieve2 s2 (src);
Sieve3 s3 (s2);
Sieve5 s5 (s3);
Sieve7 s7 (s5);
int i;
for (;;)
{
i = s7.NextNumber ();
if (i == -1)
break;
std::cout << i <<" ";
}
}
小佳佳:你倒説説,相符在哪兒?
小軒軒:你看,很直接的使用了類的,而且一看就讓人明白純虛函數的作用。老師也講過eratosthenes的sieve方法,可是我仍然會覺得這個程序十分有趣。你看,他跟我的習慣一樣,都會把private成員的名字最前面加一個_,於是使用時就很方便。
小佳佳:哦,就是。我調試程序的時候,就會出現不能access的情況。這樣就好了。
小軒軒:所以啊,我覺得有些標準,是值得熱愛的。因爲我想,看我們代碼的人很可能是很可愛很可愛的小朋友,他/她很可能沒有使用我們在用的這個編譯器,要是ta及那個我們亂七八糟一串代碼粘進去,編譯不出來,豈不要變得不可愛啦……