在无限循环C ++中定义变量一次

时间:2017-12-21 15:37:01

标签: c++ oop while-loop

我在我的项目中使用Pylon SDK。它是Basler相机的SDK。

我在gimbalControl函数的无限循环中调用main函数。

gimbalControl中,我需要定义变量并初始化万向节部分。之后,我在函数的其余部分使用那些初始化和定义的东西。以下是我的代码澄清问题的示例。

void gimbalControl(void)
{
   try
   {
        // Only executed in the first iteration
        if(!gimbalInitialized)
        {
             setupGimbal();
             configConnection(); 
             PylonInitialize();

             // Create an instant camera object with the camera device found first.
             CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());

             // Open the camera before accessing any parameters
             camera.Open();

             // Start the grabbing of images
             camera.StartGrabbing();

             gimbalInitialized = true;
       }
       else
       {
            // Wait for an image and then retrieve it. A timout of 5000 ms is used.
            camera.RetrieveResult(5000, ptrGrabResult, TimeoutHandling_ThrowException);  // CAUSES ERROR

            // Image not grabbed successfully?
            if (!ptrGrabResult->GrabSucceeded())
            {
                cout << "Cannot capture a frame from video stream" << endl;
            }
    }
    catch(...) // Catch all unhandled exceptions
    {
        printf("ERROR IN CAMERA CONNECTION\n");
    }
}

我试图让这个模块基于类,但我不知道如何在类中声明相机以便稍后在对象中使用。实际上,我不知道这种camera声明是什么!

编译此代码时出现错误camera was not declared in this scope问题1 :如何在此无限循环中定义一次相机而不会引发此错误?

问题2 :如何在类中声明camera作为私有变量?

3 个答案:

答案 0 :(得分:2)

一种方法是在camera块之外使try静态:

static CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());
try {
    ...
} catch (...) {
    ...
}

这可以确保camera对象只初始化一次,并且可以在条件中else的两边保持可访问状态。

要在班级中声明camera,请将CTlFactory::GetInstance().CreateFirstDevice()放入初始化列表中:

class MyClass {
private:
    CInstantCamera camera;
public:
    MyClass() : camera(CTlFactory::GetInstance().CreateFirstDevice()) {
    }
};

答案 1 :(得分:2)

camera只是一个常规初始化。在这种情况下,您只需调用CInstantCamera上的构造函数,该构造函数采用任何类型CTlFactory::GetInstance().CreateFirstDevice()作为唯一参数。

所有意图和目的的范围定义了对象的生命周期。除非它们共享父范围,否则一个对象不能在另一个范围内与另一个对象进行实际对话。在这种情况下,camera在第一个if条件块范围的范围内定义,但您在else条件块范围内引用它。

void gimbalControl(void)
{
   // scope #1

   try
   {
        // scope #2 (inherits #1)

        if(!gimbalInitialized)
        {
            // scope #3 (inherits #1, #2)
        }
        else
        {
            // scope #4 (inherits #1, #2)
        }
    }
    catch(...) 
    {
        // scope #5 (inherits #1)
    }
}

请注意范围 4 仅继承 1 2 ,而不是 3 ?它们处于相同的父级范围内,因此它们的生命周期不同。在这些范围内,对象不能(合理地)相互通信。

解决方案是在范围 2 中初始化camera。由于您是在循环中调用它,因此您需要生成声明static,以便它不会在每次调用期间构建,只是第一个。

参考文献 - ScopeStorage Duration - 请参阅: static

答案 2 :(得分:1)

简单地说,如果你的主要在一个循环中调用gimbalControl(),你必须声明你想要只有一次在gimbalControl之外的变量。在循环之前在main中执行:

int main(){
  int myVar=0;  //only declareded once
  while(true){
    gimbalControl();
  }
}

或将它们声明为全局变量。如果你在gimbalControl中声明它并多次调用gimballControl,那么每次调用gimbalControll它都会对它进行delcare。