由于我不想进入这里的原因,我必须将其他地方编写的代码集成到我们的程序中,只需对代码进行最少的更改。代码有一个构造函数,它创建一个struct作为局部变量(在堆栈上),然后将它分配给一个成员变量,如下所示:
struct S
{
// lots of real_T's and uint32_T's and structs and structs within structs
};
class C
{
private:
S s;
// among other members
};
C::C()
{
S tempS = {
// more than 52k lines of code!!!
};
s = tempS;
}
他们的代码是从某种Matlab模型自动生成的,是的,这是结构初始化程序中超过52,000行代码。 由于显而易见的原因导致堆栈溢出,这是我要解决的实际问题。
正在堆上创建C类(实际上它是从C派生的类的包装器),我的理解是这意味着C.s也在堆上。
请注意,我们目前正在使用Visual Studio 2010,但我们将很快转向Visual Studio 2015(TM),因此可以使用的解决方案都很好。
问题
有没有办法直接初始化C.?
或者有没有办法在堆上创建tempS,然后将其复制到C.s而不重写52k行的初始化代码?
这些方式似乎都不适合我:document。
(6)看起来像我想要的那样:
S * tempS = new S {
// more than 52k lines of code!!!
};
但是它会导致编译错误:"错误C2143:语法错误:缺少&#39 ;;'之前' {'"
答案 0 :(得分:4)
有没有办法直接初始化C.s?
是的,只需替换此代码:
C::C()
{
S tempS = {
// more than 52k lines of code!!!
};
s = tempS;
}
用这个:
C::C() :
s {
// more than 52k lines of code!!!
}
{
}
你可以see here它应该适用于支持C ++ 11或更高版本的编译器
答案 1 :(得分:0)
我会考虑将tempS
作为C
的私有静态常量成员(并在另一个编译单元中定义它)。这个初始化程序/原型基本上是数据,只是使代码不可读。此外,无论您在何处/如何定义二进制文件,二进制文件中的这些数据都是如此,因此您也可以将其显式化。
答案 2 :(得分:0)
我的建议是在课程S
中创建一个构建器,该构造函数可以使所有成员'值作为参数。按照结构中定义的相同顺序定义构造函数的参数列表。
struct S
{
// lots of real_T's and uint32_T's and structs and structs within structs
S(/*parameter_lsit*/) : /*initializer_list*/ {}
};
并将其初始化为 -
S * tempS = new S (
// more than 52k lines of code!!!
);