簡體   English   中英

在類構造函數中初始化常量

[英]Initializing Constants in Class Constructor

編輯:添加 .h 文件。

#pragma once
#include "Screen.h"
#include "../IniParams.h"

class AtcParamsMenu : public Screen
{

public:
AtcParamsMenu(ScreenManager *screenMgr, MenuTypes MenuType, IniParams *Params);
~AtcParamsMenu();

private:
enum eFields
{
    make,
    model,
    connector
};

void processKey();
void updateScreen(bool refreshAll);
void selectMaker();
void deSelectMaker();
void setMaker(AtcManufacturer maker);
void setModel();
void setCabinetType();

unsigned char idx;
unsigned char fieldIdx;
const unsigned char addY;// = 1

const unsigned char xIdx;// = 14
const unsigned char dispXidx; // = 15
const unsigned char fieldLen; // = 9
static const eFields minField = make;
static const eFields maxField = connector;

IniParams *params;
MenuTypes menuType;

};

這是一個類構造函數。

請注意,最后 4 個變量是 .h 文件中的常量無符號字符。 這不是基類,但我不喜歡為這些使用靜態。

這被認為是初始化常量的“干凈”方式嗎? 我的一些課程最終可能會有 7 到 8 個這樣的課程。

AtcParamsMenu::AtcParamsMenu(ScreenManager *screenMgr, MenuTypes MenuType, IniParams *Params) : 
Screen(screenMgr), addY(1), xIdx(14), dispXidx(15), fieldLen(9)

我們看不到足夠的代碼來全面審查情況,但這里有一些注意事項:

  1. 一般來說,這是初始化成員的正確方法
  2. 對於像這樣的簡單初始化程序,從 C++11 開始,您可以內聯提供它們:

     struct Foo { ScreenManager* screenMgr; const int myConstant = 42; Foo(ScreenManager* screenMgr); }; Foo::Foo(ScreenManager* screenMgr) : screenMgr(screenMgr) {}
  3. 但是,由於初始化根本不依賴於任何輸入,並且似乎不是特定於實例的,因此盡管您有保留,它們可能應該static const

  4. 如果它們是static const ,則不要在構造函數中初始化它們,而是單獨定義它們。 像這樣:

     struct Foo { static const int myConstant; ScreenManager* screenMgr; Foo(ScreenManager* screenMgr); }; const int Foo::myConstant = 42; Foo::Foo(ScreenManager* screenMgr) : screenMgr(screenMgr) {}

在 c++11 中,您可以直接在類聲明中初始化,這看起來更清晰:

class AtcParamsMenu
{
    const int addY = 1;
    const int xIdx = 14;
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM