作者ofd168 ()
看板C_and_CPP
标题[问题] 想要将参数定义在class同时当array长度
时间Thu Apr 20 18:44:31 2017
开发平台(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()的关系,可以一行就存起来
--
标题 [笑话] 唐三藏的愿望
唐三藏:八戒,你跑两步给为师看看。
八 戒:师父,你为啥突然想看徒儿跑步?
唐三藏:哎啊!惭愧,为师自幼在寺中长大,既没吃过猪肉,也没看过猪跑步。
1F:嘘 changhua5566:我想你也没被猪嘘过01/16 21:40
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.250.205.229
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1492685077.A.6B4.html
※ 编辑: ofd168 (60.250.205.229), 04/20/2017 18:49:37
2F:→ pttworld: 写在参数式 04/20 20:03
3F:嘘 Sidney0503: VLA是C99接受的语法 C++一直以来都不接受 04/20 22:44
4F:→ Sidney0503: g++是送你extension 反而说照规范的东西烂? 04/20 22:44
5F:→ Sidney0503: 一样想要一行可以有vector::size(); 04/20 22:45
6F:嘘 Sidney0503: 你怎麽不抱怨为什麽c语言没有move和lambda? 04/20 22:47
不知道为何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
修改一下内文
7F:推 Sidney0503: fwrite是C语法 你坚持要用就是请你换c compiler而不 04/21 01:04
8F:→ Sidney0503: 是c++ compiler 04/21 01:04
9F:→ Sidney0503: c++写入档案推荐的方法有ofstream 04/21 01:07
10F:→ Sidney0503: 连size都不需要 04/21 01:07
好,我研究一下
11F:→ pnpncat: 以 c++ 的观点来看,如果你需要的是一个静态的参数 04/21 01:38
12F:→ pnpncat: 为什麽不用 template 参数呢? 04/21 01:39
用template好像可以
如果需要的变数很多的时候,宣告的时候貌似会很大坨@@?
13F:→ fatrabitree: 你应该连参数都用读档的,不然改参数就重新编译一次 04/21 07:13
14F:→ fatrabitree: ? 04/21 07:13
!! 这好像也是可行的方案
※ 编辑: ofd168 (60.250.205.229), 04/21/2017 10:30:05
15F:推 ronin728: CLion 表示 : 04/21 10:49
16F:→ pnpncat: 把静态参数和动态参数分开 静态才放template参数 04/21 12:25
17F:→ pnpncat: 动态的用class成员和set函数去做 如果template参数还是 04/21 12:25
18F:→ pnpncat: 很多 就用另其他template把参数分组打包起来然後typedef 04/21 12:26
19F:→ pnpncat: 这样应该就没问题了 04/21 12:27
20F:→ pnpncat: 另一个方法是先写 class Parameters 来存参数 04/21 12:29
21F:→ pnpncat: 然後再用 template<Parameters p> class Setting; 来将 04/21 12:30
22F:→ pnpncat: 它静态化 04/21 12:30
23F:→ pnpncat: 推文好麻烦 我回信给你好了 04/21 12:33
感谢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
24F:推 LPH66: codepad 那个单纯只是不给你用 system 而已 04/21 17:04
25F:→ pnpncat: 想要把参数存成可读档的话就用个小技巧存一份在物件中: 04/21 20:02
26F:→ pnpncat: struct Parameters { 04/21 20:02
27F:→ pnpncat: enum{SIZE_1 = 10}; 04/21 20:02
28F:→ pnpncat: enum{SIZE_2 = 20}; 04/21 20:03
29F:→ pnpncat: int size1; 04/21 20:03
30F:→ pnpncat: int size2; 04/21 20:03
31F:→ pnpncat: Parameters() : size1(SIZE_1), size2(SIZE_2) {} 04/21 20:03
32F:→ pnpncat: }; 04/21 20:03
33F:→ pnpncat: 让编译器读SIZE_1, SIZE_2 你读size1, size2 04/21 20:05
35F:→ pnpncat: 刚刚在自己的机器上跑过没问题 04/21 20:10