在C ++中初始化一个指向struct的指针

时间:2014-03-20 02:35:36

标签: c++ pointers initialization

好的,所以,我试图做一些像#34; Compound Literal" AFAIK,我记得在为嵌入式设备编程时在C上做这个,但是我要转向C ++。我知道C ++不是C,我认为它们兼容。

GaussBlurParams *GBPs= &(GaussBlurParams) {Size(5,5), (int)3, (int)3, (int)0};

但编译器抱怨:taking address of temporary [-fpermissive]错误。我虽然使用了一个新的'构造函数,但它变得更糟。

这是我对GaussBlurParams的定义

typedef struct gaussBlurParams{
    cv::Size ksize;
    int stdX;
    int stdY;
    int borderType;
} GaussBlurParams;

我该如何克服这个问题?

最诚挚的问候!

编辑:好的,这就是我正在做的事情:

void ProcessFrames(Mat In, Mat Out, GaussBlurParams GBPs){
    GaussianBlur(In, Out, GBPs.ksize, GBPs.stdX, GBPs.stdY);
}

createTrackbar("Kernel Size Height", "Output Stream Viewer", &GBPs->ksize.height, 10, NULL);
createTrackbar("Kernel Size Width", "Output Stream Viewer", &GBPs->ksize.width, 10, NULL);
createTrackbar("STD X Sigma", "Output Stream Viewer", &GBPs->stdX, 10, NULL);
createTrackbar("STD Y Sigma", "Output Stream Viewer", &GBPs->stdX, 10, NULL);
ProcessFrames(*Frame, *OutputFrame, *GBPs);

编辑:如果您想看一下,请点击我的Code on Github! (Commit

1 个答案:

答案 0 :(得分:1)

首先,C ++中没有复合文字。

其次,在本地范围内声明的复合文字会创建一个自动对象,一旦包含块结束,它就会自动销毁。你确定需要一个指向这样一个短命对象的指针吗? (我不是说这一定是错的,但可能很容易。)

无论如何,在C ++中,不允许创建指向临时对象的指针。 (至少不是你这样做的方式 - 使用内置的一元&运算符。)只需声明一个名为的对象,并使指针指向该命名对象。忘记临时和复合文字。

GaussBlurParams GBP = { cv::Size(5,5), 3, 3, 0 };
GaussBlurParams *GBPs = &GBP;

再次确保该命名对象的生命周期与指针值的生命周期一样长,否则最终会出现无效的悬空指针。