• <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>

            eryar

            PipeCAD - Plant Piping Design Software.
            RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
            posts - 603, comments - 590, trackbacks - 0, articles - 0

            Hide Implementation Classes

            Posted on 2013-09-28 22:32 eryar 閱讀(3604) 評論(8)  編輯 收藏 引用

            Hide Implementation Classes

            eryar@163.com

            摘要:很多程序員都用過private來隱藏函數和成員變量,實際上有些類也是可以被隱藏起來的。本文是對《API Design for C++》中2.2.5的翻譯,若不不當之處,歡迎指出。

            關鍵字:API Design for C++, Hide Classes

            除了可以隱藏類的變量與方法之外,還可以隱藏任意單純實現細節的類。很多程序員都用過隱藏方法和變量,但是好多也好像忘記了并不是所有的類都是公有的。實際上,有些類只在你的實現中需要,而不應該作為公開的接口暴露出來。

            例如,考慮一個簡單的煙花(Fireworks)類:一個接口可以用來指定煙花在屏幕上位置,控制煙花的顏色、速度和煙花顆粒(particle)的數量。明顯地,這個API就需要對煙花的每個顆粒進行追蹤,以便于在每幀更新顆粒的位置。這暗示著需要引入一個用來保存每個顆粒狀態的類FireParticle,但是這個API的用戶并不需要訪問這個類,它只在實現API時才需要。這樣的類就可以設置為私有(private),即作為類Fireworks私有的部分。代碼如下所示:

             

             1 /// -*- tab-width: 4; c-basic-offset: 4; indent-tabs-mode: t -*-
             2 ///
             3 /// \file   fireworks.h
             4 /// \author Martin Reddy
             5 /// \brief  An illustration of using private classes.
             6 ///
             7 /// Copyright (c) 2010, Martin Reddy. All rights reserved.
             8 /// Distributed under the X11/MIT License. See LICENSE.txt.
             9 /// See http://APIBook.com/ for the latest version.
            10 ///
            11 
            12 #ifndef FIREWORKS_H
            13 #define FIREWORKS_H
            14 
            15 #include <vector>
            16 
            17 namespace apibook {
            18 
            19 ///
            20 /// A simple fireworks particle system, used to demonstrate
            21 /// the use of private classes to hide implementation state.
            22 ///
            23 class Fireworks
            24 {
            25 public:
            26     Fireworks();
            27 
            28     /// Set the (x, y) origin of the fireworks effect
            29     void SetOrigin(double x, double y);
            30     /// Set the RGB color (0..1) for each particle
            31     void SetColor(float r, float g, float b);
            32     /// Set the gravity acting on each particle (meters/sec)
            33     void SetGravity(float g);
            34     /// Set the speed of the particle simulation
            35     void SetSpeed(float s);
            36     /// Set the number of particles in the simulation
            37     void SetNumberOfParticles(int num);
            38 
            39     /// Start (or continue) the simulation
            40     void Start();
            41     /// Stop the simulation
            42     void Stop();
            43     /// Advance the simulation by dt seconds 
            44     void NextFrame(float dt);
            45 
            46 private:
            47     // FireParticle represents internal hidden state
            48     // (You could also forward declare this class and
            49     // only provide the definition in the .cpp file.)
            50     class FireParticle
            51     {
            52     public:
            53         double mX, mY;
            54         double mVelocityX, mVelocityY;
            55         double mAccelerationX, mAccelerationY;
            56         double mLifeTime;
            57     };
            58 
            59     double mOriginX, mOriginY;
            60     float mRed, mGreen, mBlue;
            61     float mGravity;
            62     float mSpeed;
            63     bool mIsActive;
            64     std::vector<FireParticle *> mParticles;
            65 };
            66 
            67 }
            68 
            69 #endif
            70 

            注意到在類FireParticle中我并沒有使用getter/setter。只要你愿意,當然也可以這樣做。但是也不是非常必要這么做,因為公有的接口是不能訪問這個類的。有些工程師也比較喜歡使用struct來代替class,to reflect that the structure is a Plain Old Data(POD) type。

            當然,你可能也想過隱藏類FireParticle,即在頭文件中也不出現。我將在下一節中講到怎樣來實現。

             

            Feedback

            # re: Hide Implementation Classes  回復  更多評論   

            2013-09-29 10:58 by 春秋十二月
            這里嵌套類FireParticle的變量并沒有被隱藏

            # re: Hide Implementation Classes  回復  更多評論   

            2013-09-29 17:46 by eryar
            如果給了頭文件,是可以看到源代碼,但是即使看到代碼,在程序的其他地方也不能定義一個FireParticle類的對象了。
            我是這么理解的。。。@ 春秋十二月

            # re: Hide Implementation Classes[未登錄]  回復  更多評論   

            2013-09-30 02:03 by 春秋十二月
            @eryar
            雖為私有,但暴露了它的定義,比如一個非正常情況#define private public,那么sizeof(Fireworks::FireParticle)是定義了的。

            # re: Hide Implementation Classes  回復  更多評論   

            2013-09-30 17:44 by eryar
            #define private public這招太狠了……
            這樣的話FireParticle是沒有達到隱藏的效果。
            那本書里面這里的隱藏是相對于private而言的,
            @春秋十二月

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-06 20:11 by ccsdu2009
            你這個不如impl!

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-09 19:15 by eryar
            什么是impl?
            還請指教
            @ccsdu2009

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-29 11:18 by Jayden Shui
            應該是pimpl吧。該書3.1.1.

            # re: Hide Implementation Classes  回復  更多評論   

            2013-10-29 18:38 by eryar
            哦,謝謝。。。
            :-)
            @Jayden Shui
            久久精品国产99国产精偷| 亚洲一区精品伊人久久伊人| 人人狠狠综合久久88成人| 久久精品国产99久久久| 99久久免费国产特黄| 久久一区二区三区99| 亚洲精品乱码久久久久久蜜桃图片 | 久久久无码精品亚洲日韩按摩| 久久国产免费观看精品3| 国产99久久久国产精品~~牛| 欧美精品国产综合久久| 久久精品国产99国产电影网| 人妻少妇精品久久| 久久久精品一区二区三区| 亚洲国产精品综合久久一线| 久久综合丝袜日本网| 久久精品国产清自在天天线| 久久精品国产一区二区三区| 狠狠色丁香久久综合婷婷| 99久久99久久精品国产片果冻| 久久精品无码一区二区app| 国产99精品久久| 欧美牲交A欧牲交aⅴ久久| 亚洲午夜久久久| 久久高清一级毛片| 国内精品伊人久久久久影院对白| 无码人妻精品一区二区三区久久久 | 亚洲精品乱码久久久久久蜜桃不卡| 久久精品免费观看| 久久精品中文闷骚内射| 久久久噜噜噜www成人网| 亚洲AV无一区二区三区久久 | 亚洲国产一成久久精品国产成人综合 | 久久99精品国产麻豆宅宅| 蜜臀av性久久久久蜜臀aⅴ| 伊人久久大香线蕉综合Av| 久久中文字幕精品| 久久亚洲熟女cc98cm| 无码人妻久久久一区二区三区| 久久AV高潮AV无码AV| 欧美黑人激情性久久|