[问题] 想要将参数定义在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