【问题标题】:Change a variable value in class & pass old variable with new value for further use更改类中的变量值并传递具有新值的所有变量以供进一步使用
【发布时间】:2014-10-01 13:55:21
【问题描述】:

当我开始使用 C++ 时,我将所有内容都放在一个大的 .cpp 文件中。

我现在正试图通过为我的函数创建类来改变这一点。但是我遇到了一个问题。

我有一个函数,其中有一个索引应该在某些情况下提高 1 并在下次保留这个值。例如,此索引用于重命名文件。像这样:

// if there's "motion" create new video file, reset index

if (numCont > 0 && contours.size() < 100) {
    index = 0;
    MotionDetector::saveFile(frame1, output_file, addFrames, video_nr);
}

// if there's a video file & no motion, raise index by 1
// if there's been no motion for x frames (that's what the index is for),
// stop recording

if (addFrames && numCont == 0) {
    index++;
    MotionDetector::saveFile(frame1, output_file, addFrames, video_nr);
    if(index == 30) addFrames = false;
}

saveFile 里面是这样的:

if (!addFrames) {
    // release old video file
    // create new file using video_nr for the naming part
}
else {
    //add frame to existing video
    video << frame;
} 

我想“全局”更改的另一个变量是布尔值。如果满足某些条件,则为真或假,并且必须保存此状态以供下次调用该函数时使用。

我知道我可以返回这些值,然后再次从我的 main 中使用它,但是我将有大约 3 个不同的变量(一个 Mat、一个 int、一个 bool)要返回,我不知道如何处理它.

在我把它移到它自己的类之前,我仍然有 2 个变量来让它工作,尽管我有点认为这样是没有用的。有什么简单的方法可以保持外部类中函数所做的更改?已经使用参考尝试过,但它似乎也不起作用。

现在 addFrames 是从原始类/函数调用传递的引用参数,但它不能按预期工作。

【问题讨论】:

  • 在阅读了有关如何编写好代码的书籍后重写所有内容。我只能猜测,但我的蜘蛛感觉告诉我,你有一个无法维护的软件,有很多错误。
  • 不清楚你在问什么。我猜成员变量或静态存储在某种程度上很重要。谁知道...
  • 你想在函数中添加一个静态变量吗?
  • @NeilKirk:这只能解决症状,但不能解决原因(这是错误的代码)。我投票赞成“太宽泛”。
  • 您的问题不清楚。说明您想要完成什么,向我们展示您为完成它而编写的代码,然后我们可以帮助您了解为什么它不起作用或为什么它不受欢迎(并提供更优雅的解决方案)。

标签: c++ class opencv header


【解决方案1】:

如果您考虑将执行运动检测和维护状态的代码封装到一个类中,则您不需要全局状态。你甚至可以从 MotionDetector 派生出来,我不知道你的问题到底是什么:

class MyMotionDetector : public MotionDetector {
private:
    bool addFrames;
    int index;
    Mat mat;
public:
    MyMotionDetector () :
        MotionDetector (/* ... */), addFrames (false), index (0), mat ()
    {
        /* constructor code */
    }

    void processNewData (Contours & contours, /* whatever */) {
        /* whatever */
        if (numCont > 0 && contours.size() < 100) {
            index = 0;
            MotionDetector::saveFile(frame1, output_file, addFrames, video_nr);
        }
        /* whatever */
    }

    /* whatever methods */

    ~MyMotionDetector () :
    {
        /* destructor code */
    }
};

在考虑使用全局变量之前,请考虑一个问题,例如 “为什么我不能在同一个程序中使用其中两个,在两个不同的目录中创建文件?” 正确设计对象可能意味着计数器和状态布尔值之类的东西靠近需要管理它的代码。而且您可以更灵活地实例化其中的一个以上。

至于从函数返回多个值,您正在寻找的神奇短语将是“多个返回值”。有几种方法可以做到:

Returning multiple values from a C++ function

【讨论】:

  • 感谢您编辑我的问题和对 c 的回答。我对整个 C++ 的东西还是很陌生,并且更专注于代码应该做什么而不是到目前为止它是如何做的:D 这就是为什么我之前没有过多地研究头文件和类的原因。这几乎就是我被困在那里并在使用另外几个小时进行试验之前寻求帮助的原因。我稍后会研究它,希望能更多地了解如何解决这些问题。
  • @Appuru 如果您发现自己的代码可以运行但由于某种原因让您在设计中感到不安,请考虑codereview.stackexchange.com
  • 感谢您的链接,我将来可能会使用它。我忘记在主程序中初始化我的 MotionDetector 并在我的 while 循环中通过 MotionDetector().detectMotion(...) 调用该函数..所以它一次又一次地被初始化。傻我。 /e:像这样它甚至可以按照我以前的方式工作(只需在我的标题中设置变量值 - 有什么理由不这样做吗?)..所以它只是“MotionDetector motion;”在我的主要...
猜你喜欢
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 2014-06-26
  • 2013-04-04
  • 1970-01-01
  • 2013-12-16
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多