1

メインの .cpp ファイルの 3 つのファイルがあります。

#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;
}

myClass.cpp ファイル

#include "myClass.h"


myClass::myClass(void)
{
}


myClass::~myClass(void)
{
}

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

int myClass::readTryVar()
{
    return tryVar;
}

および myClass.h ファイル

#pragma once

static int tryVar;

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


    void setTryVar();

    int readTryVar();
};

これらは非常に単純なファイルですが、静的変数がメイン関数に設定されていない理由が理解できず、myClass 関数を介して設定する必要があります。

「翻訳単位」がどのように作成されるかはよくわからないと思います.「include」ディレクティブは、実際のコンパイルの前にヘッダーファイルの内容を.cppファイルにコピーするだけです..では、なぜですか.静的変数が表示されていますか?

4

3 に答える 3

8

static複数の意味があります。の外ではclass、すべての翻訳単位に固有の変数を宣言しているためmain.cppmyClass.cpp独自のコピーがあります。

あなたが望むことを達成するために、あなたはextern変数を必要とします:

//myClass.h
extern int tryVar;

//myClass.cpp
int tryVar = 0;  //definition needed for extern variable
于 2012-04-10T21:10:35.823 に答える
5

大まかに言えば、各.cppファイルは翻訳単位と考えることができます。他のすべてはに含まれます#include。したがって、両方の.cppファイルにmyClass.hが含まれているため、どちらも。という名前の静的変数を定義しますtryVar。同じ名前の2つの変数があり、各コードファイルは独自のコピーを読み書きします。彼らはお互いのコピーを見ることができません。

変数に複数の変換ユニット(.cppファイル)からアクセスできるようにする場合は、静的であってはなりません。むしろ、externヘッダーで宣言してから、 1つの変換単位で定義する必要があります。過去のStackOverflowの質問を参照してください。Cの外部変数とは何ですか?

ヘッダーを変更して、変数を宣言します。

extern int tryVar;

myClass.cppを変更して定義します。

int tryVar;

これらの2つの変更により、プログラム全体で同じ変数の読み取りと書き込みを行うことができます。

一般的に言って、ヘッダーstaticのグローバル(つまり非メンバー)関数または変数で使用している場合は、おそらくそれを間違って行っています。(ただし、ヘッダーでメンバー関数と変数を使用することは問題ありません。).cppファイルではグローバルのみを使用してください。staticstatic

于 2012-04-10T21:10:35.270 に答える
1
  1. 静的変数が関数とクラスの外で宣言されている場合、変数にはファイル スコープがあります。この場合、tryVar は myclass.h が含まれるファイルに固有であるため、この問題では、myclass 用に 1 つの tryvAr の 2 つの固有バージョンがあります。 main.cpp の cpp & その他

  2. 静的変数が宣言されていて初期化されていない場合、コンパイラは自動的に変数をゼロに初期化します。

今あなたの問題に来ています

  1. 静的変数 tryVar の宣言は myclass.h にあります & tryVar の宣言はすべての関数とクラスの外側にあるため、変数はファイル スコープです。ファイルには独自の一意のコピーがあります。

  2. tryVar = 23; // これが機能しないのはなぜですか?

    これは実際には機能しますが、意図した方法ではありません。印刷しようとしているのは、クラス mycalss のオブジェクトを介して myclass.cpp で使用できる (一意の) tryVar 変数であるためです。

    tryVar をメイン ファイルに直接出力すると、出力が 23 として表示されます。

  3. printf("%d", mvar.readTryVar()); // これは 0 を書き出します。なぜですか??

    これは、myClass.cpp に固有の tryVar を出力しようとしているため、ゼロを返します。また、setfunction を呼び出していないため、コンパイラは変数をゼロに初期化します。これが、ゼロを取得する理由です。

    myClass.cpp ファイルに固有の tryVAr を出​​力する前に、メイン ファイルで myClass::setTryVar() 関数を呼び出してみてください。

解決

解決策 1:

tryVar を extern にします。つまり、tryVar はグローバルで、tryVar のコピーは 1 つだけ存在します。

短所: このソリューションの問題は、変数を制御できないことです。

解決策 2:

クラスの静的データ メンバーとして tryVar を取り込み、 myClass.cpp で定義します。このようにして、変数の可視性を制御できます。

于 2013-09-29T14:10:19.747 に答える