青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

ACG狂人

其實我更愛姐汁...

#

邁克爾杰克遜逝世,沉重哀悼

超級怪物在北京時間2009年6月26日——也就是今天逝世了,曾經是多么的喜愛這位歌星,被他的舞步感動得不可自控,模仿著他的步伐,欣賞著他的歌喉,感受著他帶給音樂世界的瘋狂。
不禁要感嘆,人死的真是太快了......

posted @ 2009-06-26 11:13 釀妹汁 閱讀(219) | 評論 (0)編輯 收藏

boost::bind綁定成員函數時,第一個參數傳遞對象的特殊情況

boost::bind(&memberfunction, obj, _1, _2........)類似這樣的用法,我們叫做成員函數綁定,boost庫的文檔中說的很清楚,第一個參數可以是value、pointer和reference,即傳值、傳地址和傳引用都是可以的,所以在一般情況下,下面三種使用bind的形式都是成立的。

class A
{
public:
    
void func();
}
;


A a;
A
& r = a;

boost::bind(
&A::func, a);
boost::bind(
&a::func, &a);
boost::bind(
&a::func, r);

由上面的代碼可以看出,我們可以隨便傳任意一種類對象的形式,函數模板會自動尋找最為匹配的為我們實現。但是有兩種情況是特殊的,即:
1、該對象不可進行拷貝構造函數。
2、該對象不可隨意被析構。
發現這個問題是在我編寫單件模式時的遇見的,當時發現我的單件對象在bind中被析構了一次,這很不尋常,為什么bind會調用第一個參數的析構呢?跟蹤進了boost的源碼才發現,原來所有的參數都會被拷貝一遍,然后析構一遍,這樣一來,我們傳遞參數的時候就會有一些小麻煩了,首先必須保證參數能夠被拷貝而不影響邏輯和數據一致性,其次,參數能夠被析構而不影響邏輯和數據一致性。單件是全局性質的數據,所以絕對不可以析構,那么這種情況的話,我們只好傳遞單件對象的地址,而不能傳遞值或引用。

另:附上出錯問題的代碼如下
class InputDevice
    : 
public EventSource
    , 
public Singleton<InputDevice>
{
public:
    
}
;

class TestUI
    : 
public Singleton<TestUI>
{
public:
    
~TestUI(){
        std::cout
<<"~TestUI"<<std::endl;
    }

    
void processKeyboard(EventArgs& args){
        std::cout
<<"鍵盤響應"<<std::endl;
    }


    
void processMouse(EventArgs& args){
        std::cout
<<"鼠標響應"<<std::endl;
    }

}
;


int _tmain(int argc, _TCHAR* argv[])
{
    
new FrameUpdaterManager;
    
new DelayEventSender;
    
new InputDevice;
    
new TestUI;

    InputDevice::getSingleton().mEventSet.addEvent(
"KeyDown", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"KeyUp", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseLDown", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseLUp", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseRDown", Event());
    InputDevice::getSingleton().mEventSet.addEvent(
"MouseRUp", Event());


    
//TestUI& ui = TestUI::getSingleton(); // 用此行便會出錯
    TestUI* ui = TestUI::getSingletonPtr();

    
// 出錯開始
    InputDevice::getSingleton().mEventSet["KeyDown"+= boost::bind(&TestUI::processKeyboard, ui, _1);
    InputDevice::getSingleton().mEventSet[
"KeyUp"+= boost::bind(&TestUI::processKeyboard, ui, _1);

    InputDevice::getSingleton().mEventSet[
"MouseLDown"+= boost::bind(&TestUI::processMouse, ui, _1);
    InputDevice::getSingleton().mEventSet[
"MouseLUp"+= boost::bind(&TestUI::processMouse, ui, _1);
    InputDevice::getSingleton().mEventSet[
"MouseRDown"+= boost::bind(&TestUI::processMouse, ui, _1);
    InputDevice::getSingleton().mEventSet[
"MouseRUp"+= boost::bind(&TestUI::processMouse, ui, _1);


    delete TestUI::getSingletonPtr();
    delete InputDevice::getSingletonPtr();
    delete DelayEventSender::getSingletonPtr();
    delete FrameUpdaterManager::getSingletonPtr();
    
return 0;
}

posted @ 2009-06-15 22:34 釀妹汁 閱讀(5826) | 評論 (4)編輯 收藏

log4cxx C++的日志庫使用隨記

log4cxx是一個不錯的庫,利用配置文件就可以很靈活的使用它。
說說具體用法,首先當然是在你的C++代碼中寫上Log的各種東西了
#include <log4cxx/logger.h>
#include 
<log4cxx/logstring.h>
#include 
<log4cxx/propertyconfigurator.h>

int _tmain(int argc, _TCHAR* argv[])
{
    
using namespace log4cxx;

    
// 讀取配置文件
    PropertyConfigurator::configure("log4cxx.cfg");

    
// 建立兩個logger
    LoggerPtr logger1 = Logger::getLogger("TraceYourMama");
    LoggerPtr logger2 
= Logger::getLogger("Patch");

    LOG4CXX_TRACE(logger1, 
"跟蹤");
    LOG4CXX_WARN(logger1, 
"警告");
    LOG4CXX_DEBUG(logger1, 
"調試");
    LOG4CXX_ASSERT(logger1, 
false"斷言");
    LOG4CXX_FATAL(logger1, 
"致命");

    LOG4CXX_TRACE(logger2, 
"跟蹤");
    LOG4CXX_ERROR(logger2, 
"錯誤");
    
return 0;
}


其實在實際應用中,每個類都可以搞一個logger,然后在配置文件中進行如下的設置:
# 設置root logger為DEBUG級別
#log4j.rootLogger
=TRACE,ca
log4j.logger.TraceYourMama
=ERROR,fa,ha
log4j.logger.Patch
=Trace,ca

#設置spirit為TRACE級別
#log4j.spirit
=DEBUG
#log4j.additivity.spirit
=false


# %m - message
# %n - 回車
# %d - 時間
# %.16c - Logger名稱
# %-5p - log級別
# %t - thread_id



#對Appender ca進行設置:
#這是一個控制臺類型的Appender
#輸出格式(layout)為PatternLayout
log4j.appender.ca
=org.apache.log4j.ConsoleAppender
log4j.appender.ca.layout
=org.apache.log4j.PatternLayout
log4j.appender.ca.layout.ConversionPattern
=%d %-5p %.16c - %m%n





#對Appender fa進行設置:
# 這是一個文件類型的Appender,
# 其輸出文件(File)為./debug.log,
# 輸出方式(Append)為覆蓋方式,
# 輸出格式(layout)為PatternLayout
log4j.appender.fa
=org.apache.log4j.FileAppender
log4j.appender.fa.File
=./debug.log
log4j.appender.fa.Append
=true
log4j.appender.fa.layout
=org.apache.log4j.PatternLayout
#log4j.appender.fa.layout.ConversionPattern
=%d [%t] %-5p %.16c %x - %m%n
log4j.appender.fa.layout.ConversionPattern
=%d %-5p %.16c - %m%n




posted @ 2009-06-10 17:03 釀妹汁 閱讀(2485) | 評論 (1)編輯 收藏

boost statechart

接觸了boost的狀態機,發現不是想象中的那么好用,在一些地方還得用上mpl庫里的東西,由于對模板元編程不是很熟練,搞了好些天才算弄明白這該死的mpl::list的原理和用法。
boost的狀態機是屬于靜態鏈接的狀態機,也就是說,它的圖結構是編譯期間就確定了的,在運行時不可以動態配置。所以,它的用途是有一定局限性的,但在一般情況下,它不僅很通用,而且在你會用并熟練地情況下,還會很好用,用起來很舒服,邏輯也很合理。下面就是一段代碼,當然也是借鑒了別人的東西,自己修改了一下,在MainState中添加了一個Transition做了測試,因為此前我還不知道一個狀態如何包含多個Transition,呵呵,原來是用mpl::list來做。至于這個狀態機的入門教程,網上隨處可見的三部曲:《boost 狀態機入門教程》說得很清楚。

  1 #include <iostream>
  2 #include <ctime>
  3 
  4 #include <boost/statechart/transition.hpp>
  5 #include <boost/statechart/event.hpp>
  6 #include <boost/statechart/state_machine.hpp>
  7 #include <boost/statechart/simple_state.hpp>
  8 
  9 namespace sc = boost::statechart;
 10 
 11 
 12 
 13 class EvtStartStop : public sc::event<EvtStartStop>{};
 14 class EvtReset : public sc::event<EvtReset>{};
 15 class EvtGo : public sc::event<EvtGo>{};
 16 
 17 
 18 class MainState;
 19 class StopState;
 20 class RunState;
 21 class TwoState;
 22 
 23 class Machine : public sc::state_machine<Machine, MainState>
 24 {};
 25 
 26 
 27 
 28 
 29 
 30 
 31 class MainState : public sc::simple_state<MainState, Machine, StopState>
 32 {
 33 public:
 34     typedef sc::transition<EvtReset, MainState> reactReset;
 35     typedef sc::transition<EvtGo, TwoState> reactGo;
 36     typedef boost::mpl::list<reactReset, reactGo> reactions;
 37 
 38     MainState(void){
 39         std::cout<<"進入MainState"<<std::endl;
 40         mTime = 0;
 41     }
 42 
 43     ~MainState(void){
 44         std::cout<<"退出MainState"<<std::endl;
 45     }
 46 
 47     double mTime;
 48 };
 49 
 50 
 51 // 該狀態屬于無用狀態,用于測試mpl::list的多transition用法
 52 class TwoState : public sc::simple_state<TwoState, Machine>
 53 {
 54 public:
 55     typedef sc::transition<EvtGo, MainState> reactions;
 56 
 57     TwoState(void){
 58         std::cout<<"進入TwoState"<<std::endl;
 59     }
 60 
 61     ~TwoState(void){
 62         std::cout<<"退出TwoState"<<std::endl;
 63     }
 64 };
 65 
 66 
 67 class StopState : public sc::simple_state<StopState, MainState>
 68 {
 69 public:
 70     typedef sc::transition<EvtStartStop, RunState> reactions;
 71     StopState(void){
 72         std::cout<<"進入StopState"<<std::endl;
 73     }
 74 
 75     ~StopState(void){
 76         std::cout<<"退出StopState"<<std::endl;
 77     }
 78 };
 79 
 80 class RunState : public sc::simple_state<RunState, MainState>
 81 {
 82 public:
 83     typedef sc::transition<EvtStartStop, StopState> reactions;
 84     RunState(void){
 85         std::cout<<"進入RunState"<<std::endl;
 86         mStartTime = 0;
 87     }
 88 
 89     ~RunState(void){
 90         std::cout<<"退出RunState"<<std::endl;
 91         context<MainState>().mTime += std::difftime(std::time(0), mStartTime);
 92     }
 93 
 94     std::time_t mStartTime;
 95 };
 96 
 97 
 98 int _tmain(int argc, _TCHAR* argv[])
 99 {
100     Machine mc;
101     mc.initiate();
102 
103     mc.process_event(EvtStartStop());
104     mc.process_event(EvtStartStop());
105     mc.process_event(EvtReset());
106     mc.process_event(EvtGo());
107     mc.process_event(EvtGo());
108 
109     return 0;
110 }

posted @ 2009-05-30 08:34 釀妹汁 閱讀(4402) | 評論 (0)編輯 收藏

模版特例化

寫模版多了的人,必然會遇到這樣那樣的問題,模版特例化就是解決了一個經常碰見的問題:如果我們需要根據某些特殊的模版參數類型來重新實現一下算法的話,該怎么辦呢?說的多了那也沒什么用,我們就寫一個會做除法的類吧。這個類在做整數除法的時候會同時求出余數,而在算其他類型時是不求的。代碼如下:

 1#include <iostream>
 2
 3
 4template<typename Ty>
 5class Division
 6{
 7public:
 8    Division(Ty dividend, Ty divisor)
 9        :mDividend(dividend), mDivisor(divisor){}
10public:
11    void show()
12    {
13        std::cout<<"結果 = "<<mDividend/mDivisor<<std::endl;
14    }

15
16    Ty mDividend, mDivisor;
17}
;
18
19template<>
20inline void Division<int>::show()
21{
22    std::cout<<"結果 = "<<mDividend/mDivisor<<std::endl;
23    std::cout<<"余數 = "<<mDividend%mDivisor<<std::endl;
24}

25
26
27
28
29int _tmain(int argc, _TCHAR* argv[])
30{
31    Division<int> a(2011);
32    a.show();
33
34    Division<float> b(20.0f11.0f);
35    b.show();
36    return 0;
37}

以上這種方式就叫做局部特化,關于全部特化和局部特化、全特化和偏特化,我認為他們之間的關系很緊密,界限也很模糊,硬要分類的話,以上面的Division類為例,就看下面的代碼對全部特化和局部特化的區別吧:
 1 /**
 2 @remark
 3  Division的全部特化
 4 */
 5 template<>
 6 class Division<int>
 7 {
 8 public:
 9     Division(Ty dividend, Ty divisor)
10         :mDividend(dividend), mDivisor(divisor){}
11 public:
12     void show()
13     {
14         std::cout<<"結果 = "<<mDividend/mDivisor<<std::endl;
15         std::cout<<"余數 = "<<mDividend%mDivisor<<std::endl;
16     }
17 
18     Ty mDividend, mDivisor;
19 };
20 
21 /**
22 @remark
23 Division的局部特化
24 */
25 template<>
26 inline void Division<int>::show()
27 {
28     std::cout<<"結果 = "<<mDividend/mDivisor<<std::endl;
29     std::cout<<"余數 = "<<mDividend%mDivisor<<std::endl;
30 }
上面的代碼只是說明了全部特化和局部特化,并沒有說明什么事全特化和偏特化。其實,對于只有一個參數的模版類型來說,并沒有什么全特化和偏特化的區別,但如果是一個以上的模板參數,那就是由區別的了,如下:
 1 /**
 2 @remark
 3 原始模板類
 4 */
 5 template<typename Ty, typename TyEx>
 6 class ObjectData
 7 {
 8     //
 9 };
10 
11 /**
12 @remark
13 Object的全特化
14 */
15 template<>
16 class ObjectData<intfloat>
17 {
18     //
19 };
20 
21 /**
22 @remark
23 Object的偏特化,只特化第一個參數
24 */
25 template<typename TyEx>
26 class ObjectData<int, TyEx>
27 {
28     //
29 };

以上僅為個人觀點,錯誤之處請指正。

posted @ 2009-05-25 11:14 釀妹汁 閱讀(1492) | 評論 (0)編輯 收藏

初來乍到

被朋友介紹來了這里,聽說這里氣氛很濃,嘛,不過我最在乎的還是插入代碼的效果啦,先試驗一下,嘿嘿!
1struct First
2{
3public:
4protected:
5private:
6}

posted @ 2009-05-18 08:51 釀妹汁 閱讀(144) | 評論 (0)編輯 收藏

僅列出標題
共3頁: 1 2 3 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区二区三区av电影| 欧美一区2区视频在线观看 | 一区二区三区精品视频在线观看| 先锋影音一区二区三区| 久久久精彩视频| 一区免费在线| 欧美国内亚洲| 一卡二卡3卡四卡高清精品视频| 99综合电影在线视频| 国产精品久久777777毛茸茸| 久久久久网站| 99re6这里只有精品视频在线观看| 一本色道久久综合亚洲精品不卡| 亚洲精品乱码久久久久久按摩观| 亚洲专区国产精品| 欧美激情一区二区三区高清视频| 一区二区三区视频在线看| 一区二区三区欧美在线| 亚洲天堂男人| 日韩写真在线| 亚洲国产裸拍裸体视频在线观看乱了| 欧美日本高清视频| 久久久www| 亚洲一区二区三区欧美| 亚洲国产一区二区精品专区| 欧美美女操人视频| 欧美日韩四区| 欧美.www| 久久天天狠狠| 欧美一级片久久久久久久| 久久久久久久久岛国免费| 欧美日韩不卡| 欧美午夜精品久久久久免费视 | 国模精品一区二区三区| 国产精品久久久久久久久免费樱桃| 久久av在线| 亚洲香蕉伊综合在人在线视看| 在线成人黄色| 国内一区二区在线视频观看 | 午夜精品久久久久久久男人的天堂| 在线一区免费观看| 99精品视频免费观看| 亚洲欧洲日本mm| 亚洲国产精品综合| 亚洲一区二区在线观看视频| 麻豆视频一区二区| 美女国内精品自产拍在线播放| 国产精品成人国产乱一区| 亚洲精品视频免费观看| 久久久久久久性| 亚洲一区制服诱惑| 欧美色网一区二区| 美女日韩欧美| 国产欧美一区二区三区沐欲| 国产精品色在线| 国产综合亚洲精品一区二| 亚洲一区二区三区色| 亚洲国产你懂的| 麻豆91精品| 91久久线看在观草草青青| 一卡二卡3卡四卡高清精品视频| 久久人人97超碰精品888| 免费看亚洲片| 亚洲国产欧美在线| 老司机aⅴ在线精品导航| 欧美色大人视频| 99精品欧美| 亚洲精品资源美女情侣酒店| 午夜精品成人在线| 国产精品午夜国产小视频| 亚洲欧美精品一区| 裸体丰满少妇做受久久99精品 | 亚洲视频一二区| 亚洲免费观看高清在线观看 | 久久国产天堂福利天堂| 欧美xxxx在线观看| 国产精品国产自产拍高清av王其 | 麻豆久久婷婷| 夜夜嗨av一区二区三区网页| 亚洲美女中文字幕| 国产精品美女久久久久久久| 欧美一区二区视频免费观看| 欧美大成色www永久网站婷| 亚洲精品视频在线观看网站| 欧美日本免费| 国产视频一区在线观看| 日韩小视频在线观看专区| 夜夜嗨av一区二区三区四季av| 欧美日韩精品一区二区天天拍小说 | 艳女tv在线观看国产一区| 国产精品三级久久久久久电影| 久久久国际精品| 欧美第一黄网免费网站| 亚洲欧美日韩综合一区| 亚洲欧洲日产国产综合网| 欧美午夜精品久久久久久孕妇| 久久久久久网| 欧美伦理视频网站| 性久久久久久久久久久久| 亚洲另类自拍| 国内精品视频一区| 亚洲国产日韩欧美在线99| 国产精品亚洲综合色区韩国| 亚洲成色777777在线观看影院| 亚洲无人区一区| 欧美日本在线视频| 欧美一区二区精美| 欧美成人视屏| 久久久久久久尹人综合网亚洲 | 亚洲调教视频在线观看| 樱桃成人精品视频在线播放| 一区二区激情| 亚洲人成7777| 欧美尤物巨大精品爽| 国产欧美日韩综合| 欧美国产视频日韩| 国产日韩欧美另类| 亚洲精品视频一区二区三区| 伊人久久大香线| 亚洲欧美日本精品| 一本综合精品| 欧美超级免费视 在线| 欧美中文字幕视频在线观看| 欧美另类99xxxxx| 欧美成人xxx| 蜜桃av噜噜一区| 午夜欧美大尺度福利影院在线看| 免费短视频成人日韩| 久久久久久高潮国产精品视| 欧美午夜免费电影| 亚洲国产综合91精品麻豆| 国产一区二区高清| 亚洲一二三区在线| 亚洲一区二区伦理| 欧美日韩国产综合新一区| 亚洲电影av| 欧美华人在线视频| 久久综合色播五月| 国产一区二区精品久久| 午夜精品久久久久久久| 欧美亚洲网站| 国产午夜精品久久久久久免费视 | 亚洲综合大片69999| 亚洲一区二区免费视频| 欧美日韩视频在线一区二区 | 久久综合九色综合久99| 先锋影音国产一区| 午夜久久久久久| 国产日韩欧美自拍| 欧美中文字幕| 久久亚洲一区二区三区四区| 黄色国产精品| 免费久久精品视频| 亚洲精品国产精品乱码不99| 国产精品网曝门| 午夜精品一区二区三区四区| 久久国产精品久久w女人spa| 狠狠色丁香久久婷婷综合丁香| 久久久久久电影| 欧美成人国产va精品日本一级| 亚洲精品精选| 国产精品你懂的在线| 欧美在线视频播放| 欧美激情成人在线| 国产精品99久久99久久久二8| 国产精品久久久久久妇女6080 | 一区二区三区在线观看欧美| 久久免费黄色| 亚洲欧洲日韩女同| 欧美一区二区三区男人的天堂| 国产一区二区高清| 欧美福利视频在线观看| 正在播放日韩| 欧美大片一区| 午夜精品一区二区三区电影天堂| 国产一区二区你懂的| 欧美国产日本| 欧美在线观看视频在线| 欧美激情国产日韩| 亚洲免费在线视频| 最新中文字幕亚洲| 国产乱码精品一区二区三区不卡| 亚洲国产欧美不卡在线观看| 亚洲无线一线二线三线区别av| 国产亚洲精品一区二区| 欧美精品日韩一本| 亚洲人成啪啪网站| 欧美一区二区三区视频在线观看| 在线免费观看日韩欧美| 欧美中文在线视频| 99精品福利视频| 欧美a级片网站| 欧美一区二区三区在线| 亚洲精选一区二区| 欧美日韩黄视频| 久久久免费精品| 亚洲天堂网在线观看| 最新亚洲电影| 老司机免费视频久久| 亚洲综合精品|