【问题标题】:Static member in C++ programmingC++编程中的静态成员
【发布时间】:2012-04-17 08:04:58
【问题描述】:

我正在尝试创建一个可以作为我的项目的持有者的 C++ 类,因此我已经实现了我的类成员和静态函数,但我不知道为什么编译器可以识别 setTriggerMode 中的 _nTriggerMode。

这是我的头文件:

#pragma once
class GrabberOptions
{
private:
    static int _nTriggerMode;
    static int _nExposureInMicroSec;
    static double _dFramesPerSecond;
    static int _nExsysncOn;

public:
    GrabberOptions(void);
    ~GrabberOptions(void);
    static void setTriggerMode(int triggerMode);
    static void setExposureInMicroSec(int exposureMicroSec);
    static void setFramePerSecond(double framePerSec);
    static void setExsysncOn(int exsysncOn);

    static int getTriggerMode();
    static int getExposureInMicroSec();
    static double getFramePerSecond();
    static int getExsysncOn();
};

这里是 .ccp 文件:

#include "StdAfx.h"
#include "GrabberOptions.h"
 int GrabberOptions::_nTriggerMode;

int GrabberOptions::_nExposureInMicroSec; 双 GrabberOptions::_dFramesPerSecond; int GrabberOptions::_nExsysncOn; GrabberOptions::GrabberOptions(void) { _nTriggerMode = GRABBER_CONTROLLED; _nExposureInMicroSec = 20; _dFramesPerSecond = 1000; _nExsysncOn = 1; }

GrabberOptions::~GrabberOptions(void)
{
}

void setTriggerMode(int triggerMode){ _nTriggerMode=触发模式; }

请给我一些关于如何使用静态的想法。

【问题讨论】:

标签: c++ methods static


【解决方案1】:

类的static 成员变量由类的所有实例共享。它们有时很有用,但这可能不是一个例子。静态成员函数只能访问静态成员变量。

注释掉的代码显示的类设计没有每个实例的数据;一切都是静态的。这在 C++ 中根本不是一个好的设计。

【讨论】:

    【解决方案2】:

    static 类成员变量必须在类定义之外定义:

    // .h file
    class GrabberOptions
    {
    private:
        static double _dFramesPerSecond; // declaration
    
    // .cpp file
    double GrabberOptions::_dFramesPerSecond = 1000; // definition
    

    【讨论】:

    • hmjd,谢谢您的回复。您能否请添加我如何添加我的设置器,因为我正在我的 .cpp 文件中尝试此代码, void setTriggerMode(int triggerMode){ _nTriggerMode=triggerMode; } 但我不知道为什么 _nTriggerMode 有一条红线?
    • 看起来好像函数名没有被类名限定。更改为:void GrabberOptions::setTriggerMode(int triggerMode)
    【解决方案3】:

    您需要在类定义之外,在单个翻译单元(通常是您相应的实现文件)中初始化静态:

    #include "StdAfx.h"
    #include "GrabberOptions.h"
    
    double GrabberOptions::_dFramesPerSecond; //initializes to 0
    //double GrabberOptions::_dFramesPerSecond = 1337; //if you want a different value
    
    GrabberOptions::GrabberOptions(void)
    {
        //  _nTriggerMode       = GRABBER_CONTROLLED;
        //    _nExposureInMicroSec  = 20;
            _dFramesPerSecond   = 1000;
        //  _nExsysncOn         = 1;
    }
    
    GrabberOptions::~GrabberOptions(void)
    {
    }
    

    【讨论】:

    • @user261002 不一定,可以在类内部定义方法。常量积分也是(但你的成员不是)。
    • 现在我的 .cpp 文件中的方法也有同样的问题。尝试编写设置器,但编译无法识别 _TriggerMode 变量:void setTriggerMode(int triggerMode){ _nTriggerMode=triggerMode; }
    • @user261002 不同的问题 -> 提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    相关资源
    最近更新 更多