尽管可见,但未设置静态变量

pau*_*lAl 1 c++ oop static class object

我有三个文件,一个主.cpp文件:

#include <stdio.h>
#include "myClass.h"



int main()
{

    myClass mvar;

    tryVar = 23; // why does this not work?

    printf("%d ", mvar.readTryVar()); // This writes out 0, why??

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

一个myClass.cpp文件

#include "myClass.h"


myClass::myClass(void)
{
}


myClass::~myClass(void)
{
}

void myClass::setTryVar()
{
    tryVar = 23334;
}

int myClass::readTryVar()
{
    return tryVar;
}
Run Code Online (Sandbox Code Playgroud)

和myClass.h文件

#pragma once

static int tryVar;

class myClass
{
public:
    myClass(void);
    ~myClass(void);


    void setTryVar();

    int readTryVar();
};
Run Code Online (Sandbox Code Playgroud)

它们是非常简单的文件,但我无法理解为什么静态变量不在main函数中设置,我需要通过myClass函数设置它.

我认为我不太清楚如何创建"翻译单元",我知道"include"指令只是在实际编译之前将头文件的内容复制到.cpp文件中..那么为什么不是'静态变量可见吗?

Luc*_*ore 8

static有多重含义.在a之外class,它声明了一个对每个翻译单元都是唯一的变量,因此main.cppmyClass.cpp拥有自己的副本.

要完成你想要的,你需要一个extern变量:

//myClass.h
extern int tryVar;

//myClass.cpp
int tryVar = 0;  //definition needed for extern variable
Run Code Online (Sandbox Code Playgroud)


Rob*_*edy 5

从广义上讲,您可以将每个.cpp文件视为翻译单元.其他所有内容都包含在其中#include.因此,由于两者的.cpp文件包括myClass.h,他们定义了一个名为静态变量tryVar.您有两个具有相同名称的变量,每个代码文件都会读取和写入自己的副本.他们看不到彼此的副本.

如果要从多个翻译单元(.cpp文件)访问变量,则它不应该是静态的.相反,它应该extern在标题中声明,然后在一个翻译单元中定义.查看过去的Stack Overflow问题C中的外部变量是什么?

更改标题以声明变量:

extern int tryVar;
Run Code Online (Sandbox Code Playgroud)

更改myClass.cpp以定义它:

int tryVar;
Run Code Online (Sandbox Code Playgroud)

通过这两项更改,您可以在整个程序中读取和写入相同的变量.

一般来说,如果你在标题中使用static全局(即非成员)函数或变量,那么你可能做错了.(但是在头文件中使用成员函数和变量很好.)仅在.cpp文件中使用global .staticstatic