Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在变量依赖于构造函数的类中使用静态函数_C++ - Fatal编程技术网

C++ 在变量依赖于构造函数的类中使用静态函数

C++ 在变量依赖于构造函数的类中使用静态函数,c++,C++,假设我有一个带有静态函数的类。此函数被另一部分代码称为静态函数,而不实例化类对象。然而,这个静态函数在其代码中也依赖于变量x。x、 但是,仅初始化为某个值或在构造函数中清除。但是,鉴于没有实例化类的对象,我认为变量是未定义的。因此,我有几个问题: 1) 构造函数被调用了吗 2) 变量x是否未定义 我怎样才能处理这样的案子 在下面的例子中,我希望y是25岁,但它能是吗 class CExample { public: CExample(void); ~CExample(void)

假设我有一个带有静态函数的类。此函数被另一部分代码称为静态函数,而不实例化类对象。然而,这个静态函数在其代码中也依赖于变量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;

}

由于静态函数使用的变量只存在于类实例化的对象中,因此代码不会编译


我不确定你是否理解静电。只有一个静态功能存在。你可以在任何地方叫它。如果CExample的x应该使用哪个实例?

从静态函数访问非静态成员是非法的。当我尝试编译您的程序时,请参见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

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

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


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

这看起来像是一个糟糕的设计案例。您可以通过使x为static并用5初始化来修复它,从而使它能够编译。然而,你可能会更好地重新思考你的设计和你想要它做什么。记住,静态的东西只有一个实例,但CExample的实例数量与调用它的构造函数的次数一样多。

听起来像是一个糟糕的设计决策。你应该改变你的设计,这样当你调用静态函数时,
x
中总会存储一些东西。这不会编译,
x
也需要是静态的(并且需要一个定义)。我知道是这样,但我想知道有多少静态函数,它们是否总是必须是完全自包含的?如果您需要处理实例成员,然后将实例引用传递到函数中如果您有两个对象CExample的实例,其中一个x等于5,另一个x等于10,您希望对y的foo result的静态调用是什么?25? 50? 37.5? 抛出异常?您需要了解对象实例模型,以及静态方法如何在该框架内工作。希望我的问题能让你思考静态方法、实例方法和外部函数之间的区别,以及为什么/何时使用每种方法。你的意思是说函数存在,但是该类不能访问,并且不能访问该类的其他部分?@GustavoLitovsky在静态函数中只能访问静态成员。静态函数不知道实例级方法或成员,因为它在类上操作,而不是在instance@DanF:我声明了x static,但它仍然抱怨foo试图访问它。@GustavoLitovsky可能是因为您尚未在cpp文件中将其定义为:
int-CExample::int=0
或类似的东西。在cpp类中与其他成员分开定义它吗?它需要在函数内部还是外部声明?它在调用同一个函数之间是否保持其值?谢谢。是的。我只是想了解如何利用静态函数,但它并不像我想象的那么简单,总是需要仔细设计。