如何以正确的方式做到这一点?在函数中声明静态对象

How to do this the right way? Declaring static object in function

提问人:Jnx 提问时间:9/6/2023 最后编辑:Jean-Baptiste YunèsJnx 更新时间:9/6/2023 访问量:61

问:

我这样做的方式有效,但感觉像是令人难以置信的糟糕编程。

void draw_display() 
{
    static DISPLAY mydisplay = DISPLAY(parameters);
    mydisplay.set_orientation(0);

    do something with mydisplay... 
}

因此,该函数由微控制器的中断调用。 在我的理想世界中,我会在某个地方声明对象是全局的,设置方向,然后在函数中使用全局对象。draw_displaymydisplay

正确的 c++ 方法是什么?

这更像是一个“以正确的方式做事”并从中学习的问题。

C++ 对象 全局

评论

0赞 Pepijn Kramer 9/6/2023
我知道您需要性能,并且只想进行一次初始化。我通常不赞成全局变量(大项目/单元可测试性)。但是,如果这是一个中断处理程序,我会将 DISPLAY 的初始化移出函数,并在您的代码中执行一次。这样,您对中断的第一次处理可能会太慢(因为 mydisplay 将在第一次调用时初始化)。
0赞 Jean-Baptiste Yunès 9/6/2023
您可能会在 C++ 中阅读有关“单例模式”的信息。
0赞 HolyBlackCat 9/6/2023
你是在问如何只打电话一次吗?set_orientation
0赞 Jnx 9/6/2023
@HolyBlackCat 是的,我的目标是只给set_orientation打一次电话。此外,在函数中将对象初始化为静态感觉有点错误。
0赞 Jnx 9/6/2023
@PepijnKramer 是的,你是绝对正确的。因此,在这种情况下,您会倾向于全局声明对象吗?然后我可以将set_orientation移动到主。

答:

-1赞 SOUMYA SAMANTA 9/6/2023 #1

确保 DISPLAY 类具有具有所需参数的正确构造函数。如有必要,您还应该确保它有一个析构函数。

在 draw_display 函数外部初始化 mydisplay。这样可以确保不会在每次调用函数时都创建新的 DISPLAY 对象。最初可以使用构造函数或初始化函数来设置对象。

class DISPLAY {
    public:
        DISPLAY(parameters) {
            // Constructor implementation with parameters
        }
    
        ~DISPLAY() {
            // Destructor implementation if necessary
        }
    
        void set_orientation(int orientation) {
            // Implementation of set_orientation
        }
    
        // Other member functions and data members
   };
    
    // Initialize mydisplay outside of draw_display
    static DISPLAY mydisplay(parameters);
    
    void draw_display() {
        mydisplay.set_orientation(0);
    
        // Do something with mydisplay...
    }

评论

1赞 Jean-Baptiste Yunès 9/6/2023
OP 希望在“开始”时调用。至少把它放在 ctor 中。set_orientation
1赞 HolyBlackCat 9/6/2023 #2

我的目标是只给set_orientation打一次电话。

然后,您可以使用立即调用的 lambda:

static DISPLAY mydisplay = []{
{
    DISPLAY ret(parameters);
    ret.set_orientation(0);
    return ret;
}();

评论

0赞 Jnx 9/8/2023
这似乎是全局对象的一个很好的替代方案。谢谢!