在类中使用静态函数,其中变量依赖于构造函数

时间:2013-01-08 21:25:40

标签: c++

假设我有一个具有静态功能的类。此函数在代码的另一部分被称为静态,而不实例化类对象。但是,这个静态函数在其代码中也具有对变量x的依赖性。但是,x仅初始化为某个值或在构造函数中清除。但是,鉴于没有实例化类的对象,我相信变量是未定义的。所以,我有几个问题:

1)是否完全调用了构造函数?

2)变量x是否未定义?

我如何解决这类案件?

在下面的例子中,我希望y为25,但是它可以吗?

class CExample
{
public:

    CExample(void);
    ~CExample(void);
    static void foo();

    int x;
};

CExample::CExample()
{
    x = 5;
}


void CExample::foo()
{
    int y = x*5;

}

4 个答案:

答案 0 :(得分:2)

您的代码无法编译,因为静态函数使用的变量只存在于由类实例化的对象中。

我不确定你是否理解静态。仅存在一个静态函数。你可以从任何地方打电话。如果CExample的x应该使用哪个实例?

答案 1 :(得分:2)

这看起来像一个糟糕的设计案例。你可以修复它,使它通过使x静态并用5初始化来编译。但是你可能会更好地重新思考你的设计以及你想要它做什么。请记住,只有一个静态的实例,但是当你调用它的构造函数时,有很多CExample的实例。

答案 2 :(得分:1)

静态成员函数是类的服务,而不是类的特定对象。类的静态数据成员和静态成员函数独立于该类对象的实例化而存在。

使用静态函数不会调用其各自类的构造函数,因此您的变量将不存在,从而导致编译错误。

请记住,静态成员函数存在并独立于类的任何对象运行。

答案 3 :(得分:0)

从静态函数访问非静态成员是非法的。当我尝试编译你的程序时看到gcc的输出:

test.cpp: In static member function ‘static void CExample::foo()’:
test.cpp:9: error: invalid use of member ‘CExample::x’ in static member function