#include <iostream>
using namespace std ;
//定义一个类
class ScreenRecoveryUI
{
private :
int r , g , b ;
char buffer[10] ;
char *p ;
public :
ScreenRecoveryUI();
void setvalue(int a , int b , int c);
void print();
};
//使用初始化列表的方式初始化构造函数里的私有环境变量
ScreenRecoveryUI::ScreenRecoveryUI():
r(0),
g(0),
b(0),
p(nullptr){
for(int i = 0 ; i < 10 ; i++){
buffer[i] = 0 ;
}
}
void ScreenRecoveryUI::setvalue(int a ,int b , int c)
{
this->r = a ;
this->g = b ;
this->b = c ;
}
void ScreenRecoveryUI::print()
{
cout << "r:" << this->r << endl << "g:" << this->g << endl << "b:" << b << endl ;
}
int main(void)
{
ScreenRecoveryUI screen ;
screen.setvalue(255,255,0);
screen.print();
return 0 ;
}
运行结果:
r:255
g:255
b:0
明白了上述用法以后,Android Recovery源代码里面也有类似的案例。下面这个是Recovery的一个构造函数,代码位于:screen_ui.cpp,它的类的实现在screen_ui.h。如下这个ScreenRecoveryUI类,这个类是继承于RecoveryUI类的,这个文件在screen_ui.h
class ScreenRecoveryUI : public RecoveryUI {
public:
ScreenRecoveryUI();
void Init();
void SetLocale(const char* locale);
// overall recovery state ("background image")
void SetBackground(Icon icon);
// progress indicator
void SetProgressType(ProgressType type);
void ShowProgress(float portion, float seconds);
void SetProgress(float fraction);
void SetStage(int current, int max);
// text log
void ShowText(bool visible);
bool IsTextVisible();
bool WasTextEverVisible();
// printing messages
void Print(const char* fmt, ...) __printflike(2, 3);
void ShowFile(const char* filename);
// menu display
void StartMenu(const char* const * headers, const char* const * items,
int initial_selection);
int SelectMenu(int sel);
void EndMenu();
void KeyLongPress(int);
void Redraw();
enum UIElement {
HEADER, MENU, MENU_SEL_BG, MENU_SEL_BG_ACTIVE, MENU_SEL_FG, LOG, TEXT_FILL, INFO
};
void SetColor(UIElement e);
private:
Icon currentIcon;
int installingFrame;
const char* locale;
bool rtl_locale;
pthread_mutex_t updateMutex;
GRSurface* backgroundIcon[5];
GRSurface* backgroundText[5];
GRSurface** installation;
GRSurface* progressBarEmpty;
GRSurface* progressBarFill;
GRSurface* stageMarkerEmpty;
GRSurface* stageMarkerFill;
ProgressType progressBarType;
float progressScopeStart, progressScopeSize, progress;
double progressScopeTime, progressScopeDuration;
// true when both graphics pages are the same (except for the progress bar).
bool pagesIdentical;
size_t text_cols_, text_rows_;
// Log text overlay, displayed when a magic key is pressed.
char** text_;
size_t text_col_, text_row_, text_top_;
bool show_text;
bool show_text_ever; // has show_text ever been true?
char** menu_;
const char* const* menu_headers_;
bool show_menu;
int menu_items, menu_sel;
// An alternate text screen, swapped with 'text_' when we're viewing a log file.
char** file_viewer_text_;
pthread_t progress_thread_;
int animation_fps;
int installing_frames;
int iconX, iconY;
int stage, max_stage;
void draw_background_locked(Icon icon);
void draw_progress_locked();
void draw_screen_locked();
void update_screen_locked();
void update_progress_locked();
static void* ProgressThreadStartRoutine(void* data);
void ProgressThreadLoop();
void ShowFile(FILE*);
void PutChar(char);
void ClearText();
void DrawHorizontalRule(int* y);
void DrawTextLine(int* y, const char* line, bool bold);
void DrawTextLines(int* y, const char* const* lines);
void LoadBitmap(const char* filename, GRSurface** surface);
void LoadBitmapArray(const char* filename, int* frames, GRSurface*** surface);
void LoadLocalizedBitmap(const char* filename, GRSurface** surface);
};
下面是这个类的构造函数的实现,其中构造函数就采用了初始化列表的方式来初始化字段,以下构造函数的实现在screen_ui.cpp文件中可以找到。
ScreenRecoveryUI::ScreenRecoveryUI() :
currentIcon(NONE),
installingFrame(0),
locale(nullptr),
rtl_locale(false),
progressBarType(EMPTY),
progressScopeStart(0),
progressScopeSize(0),
progress(0),
pagesIdentical(false),
text_cols_(0),
text_rows_(0),
text_(nullptr),
text_col_(0),
text_row_(0),
text_top_(0),
show_text(false),
show_text_ever(false),
menu_(nullptr),
show_menu(false),
menu_items(0),
menu_sel(0),
file_viewer_text_(nullptr),
animation_fps(20),
installing_frames(-1),
stage(-1),
max_stage(-1) {
for (int i = 0; i < 5; i++) {
backgroundIcon[i] = nullptr;
}
pthread_mutex_init(&updateMutex, nullptr);
}