[問題] 想要將參數定義在class同時當array長度
開發平台(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()的關係,可以一行就存起來
--
標題 [笑話] 唐三藏的願望
唐三藏:八戒,你跑兩步給為師看看。
八 戒:師父,你為啥突然想看徒兒跑步?
唐三藏:哎啊!慚愧,為師自幼在寺中長大,既沒吃過豬肉,也沒看過豬跑步。
噓
01/16 21:40,
01/16 21:40
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.205.229
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1492685077.A.6B4.html
※ 編輯: ofd168 (60.250.205.229), 04/20/2017 18:49:37
→
04/20 20:03, , 1F
04/20 20:03, 1F
噓
04/20 22:44, , 2F
04/20 22:44, 2F
→
04/20 22:44, , 3F
04/20 22:44, 3F
→
04/20 22:45, , 4F
04/20 22:45, 4F
噓
04/20 22:47, , 5F
04/20 22:47, 5F
不知道為何s大這麼生氣
我只覺得這條路如果走不通就只能想別條路,所以想詢問有沒有其他解法
如果在一個structure中定義許多靜態配置的變數,
若要將structure寫入檔案中儲存,可以使用fwrite簡單的一行儲存
而不用對structure中各自變數去做個別儲存,方便很多
目前是遇到,如果在structure中是宣告指標/vector再去配置空間
好像沒辦法使用fwrite與sizeof簡單存入檔案中
必須要個別處理
所以才想問有沒有可以簡單儲存的前提下,讓我的array長度的變數
能夠放在其他structure呢?
比如 以下這種希望的效果,但是語法上不合
struct A_{
const int array_size = 10;
} A;
struct B{
int array[A.array_size];
};
目前看起來也許這樣比較可行
namespace A{
const int array_size = 10;
};
struct B{
int array[A::array_size];
};
讓人一樣知道array_size宣告在哪裡
可是如果我想把A裡面所有變數儲存,就必須每個變數都各別處裡
如果未來增加變數,寫入檔案的function也必須同步修改
不知道有沒有比較好的方法呢
※ 編輯: ofd168 (123.195.57.89), 04/21/2017 00:48:54
修改一下內文
推
04/21 01:04, , 6F
04/21 01:04, 6F
→
04/21 01:04, , 7F
04/21 01:04, 7F
→
04/21 01:07, , 8F
04/21 01:07, 8F
→
04/21 01:07, , 9F
04/21 01:07, 9F
好,我研究一下
→
04/21 01:38, , 10F
04/21 01:38, 10F
→
04/21 01:39, , 11F
04/21 01:39, 11F
用template好像可以
如果需要的變數很多的時候,宣告的時候貌似會很大坨@@?
→
04/21 07:13, , 12F
04/21 07:13, 12F
→
04/21 07:13, , 13F
04/21 07:13, 13F
!! 這好像也是可行的方案
※ 編輯: ofd168 (60.250.205.229), 04/21/2017 10:30:05
推
04/21 10:49, , 14F
04/21 10:49, 14F
→
04/21 12:25, , 15F
04/21 12:25, 15F
→
04/21 12:25, , 16F
04/21 12:25, 16F
→
04/21 12:26, , 17F
04/21 12:26, 17F
→
04/21 12:27, , 18F
04/21 12:27, 18F
→
04/21 12:29, , 19F
04/21 12:29, 19F
→
04/21 12:30, , 20F
04/21 12:30, 20F
→
04/21 12:30, , 21F
04/21 12:30, 21F
→
04/21 12:33, , 22F
04/21 12:33, 22F
感謝p大直接寄信教學
目前CODE寫起來如下
http://codepad.org/yVhrAu4Q
class Parameters {
public:
const static int size1 = 10;
const static int size2 = 20;
};
template <typename Parameters>
class testClass
{
int Arr1[Parameters::size1];
int Arr2[Parameters::size2];
};
int main()
{
testClass<Parameters> testObj;
printf("testClass size = %d\n", sizeof(testObj));
system("PAUSE");
return 0;
}
VC2015是可以跑得
不過
1. 用codepad說有 Disallowed system call: SYS_fork
這樣是代表有風險嗎?
2. 另外覺得template <typename Parameters> 這段有點風險
因為從這行並沒有限定要是 Parameters 這個class
看stackoverflow的這篇
Passing a structure as a template-parameter - How can I fix this code?
https://goo.gl/L7OWWE
他是使用 template <Parameters const& p> 這種做法
不過當我嘗試使用時候,就會跑出一堆error
http://codepad.org/FOcqxCch
3. 雖然這個parameter可存檔,而且一樣讓使用的人知道這個變數放哪
比如Parameter::size1, 雖然這部分就是2的問題,覺得有點怪怪的
發現最後一的問題,好像不能讀 XDDDDD
原本做法是 把parameter object存入檔案,要讀的時候就直接讀檔並直接蓋掉
parameter的object, 在debug mode就可以看到各個變數讀出來的值。
改成這種作法,就跟使用namespace好像差不多了,不過優點是因為可以存
想說要求Parameter裡面所有變數都是double,讀的時候放在一個double array
此array的長度就可以利用sizeof(parameter)來得到
缺點是無法很容易地知道 這個double array某一個elemet對應的Parameter是
哪個變數,不過總歸是個解法
※ 編輯: ofd168 (60.250.205.229), 04/21/2017 16:10:16
推
04/21 17:04, , 23F
04/21 17:04, 23F
→
04/21 20:02, , 24F
04/21 20:02, 24F
→
04/21 20:02, , 25F
04/21 20:02, 25F
→
04/21 20:02, , 26F
04/21 20:02, 26F
→
04/21 20:03, , 27F
04/21 20:03, 27F
→
04/21 20:03, , 28F
04/21 20:03, 28F
→
04/21 20:03, , 29F
04/21 20:03, 29F
→
04/21 20:03, , 30F
04/21 20:03, 30F
→
04/21 20:03, , 31F
04/21 20:03, 31F
→
04/21 20:05, , 32F
04/21 20:05, 32F
→
04/21 20:10, , 33F
04/21 20:10, 33F
→
04/21 20:10, , 34F
04/21 20:10, 34F
→
04/27 14:56, , 35F
04/27 14:56, 35F