[問題] 想要將參數定義在class同時當array長度

作者: ofd168 (大色狼來襲)   2017-04-20 18:44:31
開發平台(Platform): (Ex: Win10, Linux, ...)
WIN10 / LINUX
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC2015 / gcc
問題(Question):
想要用C++來跑模擬
目前是將參數的部分定義在一個class/structure類似header的概念
其中部分參數希望拿來當靜態配置變數的array長度
問題在於,GCC雖然支援靜態配置長度是給變數,然而VC比較嚴謹
還不允許這種寫法,一定要是定值
目前做法就是用define的方式
使用class/structure 來管理 系統變數的原因
1. 讓變數找的到哪裡宣告的(當IDE不夠強的時候)
(補充,某些因素,在linux環境下IDE不怎麼好用)
2. 可以加上const保證這些變數都不會被其他function修改。
目前是所有參數都是public
但是現在希望讓變數整理再一起,有一個統一的規範
現在是將起始值放在建構子裡
問題是,希望讓VC能直接吃class的變數的長度又不使用動態配置
因為靜態配置的優點是可以直接用sizeof(class)計算長度,
然後用指令直接寫入檔案之類的存起來,而不用對裡面所有變數個別處理
也是希望類似
class A{
const int abc;
A(){
abc = 10;
}
}
然後讓整個 class A都無法更動。
網路上看到的方法貌似是宣告同時給值
class A{ .abc = 10};
然而如果變數超多就會看起來很長
原本用structure的目的是為了讓每個變數能夠知道原本放在哪
同時利用傳入變數時加上const使之只能讀不能改
想到另一種解法是宣告在namesapce裡面
然後所有的變數都加上const
用structure的優點是,如果要兩個模擬環境,可以宣告兩個,不過目前沒有這樣需求
用namespace是 可以加上const外,也可以讓變數找的到宣告的地方
(補充說明,目前的環境沒辦法利用tool幫忙找使用的變數原本宣告在哪)
為了一致性,structure還能有別種作法嗎?
因為使用namespace,如果要將變數儲存就必須對每個變數個別處理,
如果是使用structure要儲存,因為sizeof()的關係,可以一行就存起來
作者: changhua5566   2016-01-16 21:40:00
我想你也沒被豬噓過
作者: pttworld (批踢踢世界)   2017-04-20 20:03:00
寫在參數式
作者: Sidney0503 (Sidney0503)   2017-04-20 22:44:00
VLA是C99接受的語法 C++一直以來都不接受g++是送你extension 反而說照規範的東西爛?一樣想要一行可以有vector::size();你怎麼不抱怨為什麼c語言沒有move和lambda?fwrite是C語法 你堅持要用就是請你換c compiler而不是c++ compilerc++寫入檔案推薦的方法有ofstream連size都不需要
作者: pnpncat (meow)   2017-04-21 01:38:00
以 c++ 的觀點來看,如果你需要的是一個靜態的參數為什麼不用 template 參數呢?
作者: fatrabitree (胖兔子)   2017-04-21 07:13:00
你應該連參數都用讀檔的,不然改參數就重新編譯一次?
作者: ronin728 (浪人)   2017-04-21 10:49:00
CLion 表示 :
作者: pnpncat (meow)   2017-04-21 12:25:00
把靜態參數和動態參數分開 靜態才放template參數動態的用class成員和set函數去做 如果template參數還是很多 就用另其他template把參數分組打包起來然後typedef這樣應該就沒問題了另一個方法是先寫 class Parameters 來存參數然後再用 template<Parameters p> class Setting; 來將它靜態化推文好麻煩 我回信給你好了
作者: LPH66 (-6.2598534e+18f)   2017-04-21 17:04:00
codepad 那個單純只是不給你用 system 而已
作者: pnpncat (meow)   2017-04-21 20:02:00
想要把參數存成可讀檔的話就用個小技巧存一份在物件中:struct Parameters {enum{SIZE_1 = 10};enum{SIZE_2 = 20};int size1;int size2;Parameters() : size1(SIZE_1), size2(SIZE_2) {}};讓編譯器讀SIZE_1, SIZE_2 你讀size1, size2http://codepad.org/cpUAxiQg剛剛在自己的機器上跑過沒問題
作者: hunandy14 (Charlott.HonG)   2017-04-27 14:56:00

Links booklink

Contact Us: admin [ a t ] ucptt.com