亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

靜態常量字符串(類成員)

靜態常量字符串(類成員)

C++
瀟瀟雨雨 2019-09-18 19:30:36
我想為一個類(在這種情況下是一個形狀工廠)有一個私有靜態常量。我想要有類似的東西。class A {   private:      static const string RECTANGLE = "rectangle";}不幸的是,我從C ++(g ++)編譯器中得到了各種錯誤,例如:ISO C ++禁止成員'RECTANGLE'的初始化非整數類型'std :: string'的靜態數據成員的無效類初始化錯誤:使'RECTANGLE'靜止這告訴我這種成員設計不符合標準。如何在不使用#define指令的情況下擁有私有文字常量(或者可能是公共的)(我想避免數據全局性的丑陋?。┤魏螏椭硎举澷p。
查看完整描述

3 回答

?
繁星coding

TA貢獻1797條經驗 獲得超4個贊

您必須在類定義之外定義靜態成員并在那里提供初始化程序。


第一


// In a header file (if it is in a header file in your case)

class A {   

private:      

  static const string RECTANGLE;

};

接著


// In one of the implementation files

const string A::RECTANGLE = "rectangle";

您最初嘗試使用的語法(類定義中的初始化程序)僅允許使用整數和枚舉類型。


從C ++ 17開始,您有另一個選項,它與您的原始聲明非常相似:內聯變量


// In a header file (if it is in a header file in your case)

class A {   

private:      

  inline static const string RECTANGLE = "rectangle";

};

無需額外定義。


查看完整回答
反對 回復 2019-09-18
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

在類定義中,您只能聲明靜態成員。它們必須在課堂之外定義。對于編譯時積分常量,標準會使您可以“初始化”成員。但它仍然不是一個定義。例如,如果沒有定義,那么獲取地址是行不通的。


我想提一提,我沒有看到使用的std :: string在為const char []的利益為常數。std :: string很好,除了它需要動態初始化。所以,如果你寫的東西像


const std::string foo = "hello";

在命名空間范圍內,foo的構造函數將在執行main啟動之前運行,此構造函數將在堆內存中創建常量“hello”的副本。除非你真的需要RECTANGLE成為std :: string,否則你也可以寫


// class definition with incomplete static member could be in a header file

class A {

    static const char RECTANGLE[];

};


// this needs to be placed in a single translation unit only

const char A::RECTANGLE[] = "rectangle";

那里!沒有堆分配,沒有復制,沒有動態初始化。


干杯,s。


查看完整回答
反對 回復 2019-09-18
  • 3 回答
  • 0 關注
  • 766 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號