C++ 如何创建对象数组并访问子类中的函数?c++;

C++ 如何创建对象数组并访问子类中的函数?c++;,c++,class,C++,Class,要同时捕获图像,我想创建一个对象数组(cam)。使用当前阵列,我可以执行类xiAPIplus\u摄像头的功能,但类xiAPIplus\u摄像头内的功能不会启动。 e、 g:如果我启动cv::Mat GetNextImageOcvMat()改为运行类析构函数 class xiAPIplusCameraOcv : public xiAPIplus_Camera { public: /** * Initialize the xiAPIplusCameraOcv class. *

要同时捕获图像,我想创建一个对象数组(
cam
)。使用当前阵列,我可以执行
类xiAPIplus\u摄像头
的功能,但
类xiAPIplus\u摄像头
内的功能不会启动。 e、 g:如果我启动
cv::Mat GetNextImageOcvMat()改为运行类析构函数

class xiAPIplusCameraOcv : public xiAPIplus_Camera
{
public:
    /**
    * Initialize the xiAPIplusCameraOcv class.
    */  
    xiAPIplusCameraOcv();
    /**
    * Class destructor. Free allocated memory, release images
    */
    virtual ~xiAPIplusCameraOcv();
    /**
    * Reads an image from the camera using XiAPI, stores the image in OpenCV Mat format.
    * @return OpenCV Mat image. 
    */
    cv::Mat         GetNextImageOcvMat(); //Reads an image and converts it to OpenCV Mat
    /**
    * Converts a XiAPI image (xiAPIplus_Image*) to OpenCV Mat.
    * @param input_image[in] Input xiAPIplus_Image* to be converted.
    * @return converted OpenCV IpliImage* image. 
    */
    cv::Mat         ConvertOcvMat(xiAPIplus_Image * input_image); //Converts an image to OpenCV Mat
    //virtual xiAPIplusCameraOcv& operator >> (CV_OUT Mat& input_image);
    
    private:
    
    /**
    * Resets the Opencv image if properties of XI_IMG have changed. Resets the cv_mat_image_.
    */
    void resetCvImage_();               //Resets the OpenCV image properties if XI_IMG format has changed
    cv::Mat                 cv_mat_image_;
    xiAPIplus_Image *   next_image_;      
    int                 timeout_;
    int             counter_;
    int             index_;
};
主函数能够创建数组,但我在使用它时遗漏了一些东西

int main(int argc, char* argv[])
{
    try
    {
        xiAPIplusCameraOcv cam[5];
        int n = cam[4].GetNumberOfConnectedCameras();
        
        int uidArray[4];
        char* snArray[4];
        
        for (int id = 0; id < n; id++)
        {
            printf("Opening %d. camera ...\n", id + 1);
            cam[id].OpenByID(id);
            cam[id].GetSerialNumber(sn, 100);
            
        }
        for (int exp = 0; exp < n; exp++)
        {
            cam[exp].StartAcquisition();
            
            Mat cv_mat_image = cam[exp].GetNextImageOcvMat(); //
            printf("GetNextImageOcvMat\n");

            cv::imwrite(save_at, cv_mat_image);// , compression_params);

            cam[exp].StopAcquisition();
        }

        printf("Done\n");

        cv::waitKey(500);
    }
    catch (xiAPIplus_Exception& exp)
    {
        printf("Error:\n");
        exp.PrintError();
#ifdef WIN32
        Sleep(2000);
#endif
        cv::waitKey(2000);
        return -1;
    }
    return 0;
}

你的索引正确吗?您创建了一个由5个“摄影机”组成的阵列。然后,根据从第四个“摄影机”上的某个方法提取的“n”在该阵列上循环。您正在使用“exp”,这并不违法,但不会使代码更易于阅读。如果没有正确地索引到cam[]中,则可能(取决于“xiAPIplus_Exception”的定义)引发异常,从而在catch()块中结束,此时cam[]数组超出范围,并调用每个项的析构函数。也许把“XIAPPLUSCAMERAOCV cam[5];”行放在try/catch块之外?很有帮助,我没有注意到我重复使用了“exp”。但正如你所说,这并没有导致错误。xiAPIplus_异常引发,它没有改变将“xiAPIplusCameraOcv cam[5];”放在我的try/catch区块之外的问题:您认为“n”设置为什么?这行代码:Mat cv_Mat_image=cam[exp].GetNextImageOcvMat();抛出捕获的异常?如果是这样的话,那么在实现代码的某个地方就有问题了(我们看不到)。n被设置为4。好吧,如果是这样的话,我会试着自己找出答案,因为我不想在这里发布这么多代码。如果有人想看:
/**
* Class destructor. Free allocated memory, release images
*/
xiAPIplusCameraOcv::~xiAPIplusCameraOcv(){
    printf("Closing xiAPIplus_Ocv camera\n");
    cv_mat_image_.release();
}