6

グローバルオブジェクトを作成するための以下は、コンパイルエラーになります。

#include "stdafx.h" 
#include <iostream> 

using namespace System; 
using namespace std;    
#pragma hdrstop 

class Tester;


void input();

class Tester
{
    static int number = 5;

public:

    Tester(){};
    ~Tester(){};

    void setNumber(int newNumber)
    {
        number = newNumber;
    }

    int getNumber()
    {
        return number;
    }
}

Tester testerObject;

void main(void)
{
    cout << "Welcome!" << endl;

        while(1)
        {
            input();
        }
}

void input()
{
    int newNumber = 0;

    cout << "The current number is " << testerObject.getNumber();
    cout << "Change number to: ";

        cin >> newNumber;

    cout << endl;

    testerObject.setNumber(newNumber);

    cout << "The number has been changed to " << testerObject.getNumber() << endl;
}

コンパイルエラーは次のとおりです。

1>------ Build started: Project: test, Configuration: Debug Win32 ------
1>Compiling...
1>test.cpp
1>.\test.cpp(15) : error C2864: 'Tester::number' : only static const integral data members can be initialized within a class
1>.\test.cpp(33) : error C2146: syntax error : missing ';' before identifier 'testerObject'
1>.\test.cpp(33) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\test.cpp(49) : error C2039: 'getNumber' : is not a member of 'System::Int32'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Int32'
1>.\test.cpp(55) : error C2039: 'setNumber' : is not a member of 'System::Int32'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Int32'
1>.\test.cpp(57) : error C2039: 'getNumber' : is not a member of 'System::Int32'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Int32'
1>Build log was saved at "file://c:\Users\Owner\Documents\Visual Studio 2008\Projects\test\test\Debug\BuildLog.htm"
1>test - 6 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
  1. ここで試みたように、グローバルクラスオブジェクトを正しく作成するにはどうすればよいですか。
  2. そして、「クラス内で初期化できるのは static const 整数データメンバーのみ」という問題を修正するにはどうすればよいですか
  3. 基本的に、これをコンパイルできるように残りのエラーを修正するにはどうすればよいですか?

ファイル スコープでグローバル クラス オブジェクトを宣言するのが好きです (ファイル スコープですべてのグローバルを宣言するのが好きです)。なぜなら、別のソース ファイルを作成して「extern」を実行しなければならない場合、それが非常に複雑になり、うまくいかないからです。ただし、最終的にはそれを行う方法を理解したいと思っています...私が見ているすべてのチュートリアルはコンパイルされないようですが、コンパイルされない限り、それを再作成する方法がわかりません!

これをコンパイルすることができれば、これを行う方法をうまく学ぶことができます。したがって、誰かが上記を文字通りコピーして Visual C++ Express 2008 に貼り付けて動作するように書き直すことができれば、最終的にそれを再作成する方法を理解できるようになります。これに対する修正を見て、私は非常に興奮しています! グローバルオブジェクトを正しく動作させることができないだけです! グローバルクラスオブジェクトの宣言に関するその他の情報...またはそのことに関するその他の情報は大歓迎です!

4

4 に答える 4

11

エラーの対処を 1 つずつ開始するだけです。多くのエラーは最初のエラーからカスケードされているだけなので、数個しかない場合でも多くの問題があるように見えます。上から始めてください:

1>.\test.cpp(15) : error C2864: 'Tester::number' : only static const integral data members can be initialized within a class

static、const、および整数型のいずれかでない限り、クラス定義でメンバーを初期化することはできません。= 5の宣言の" " はそのままにしておきnumberます。Tester::number次に、次のように、クラス定義の外に の定義が必要になります。

int Tester::number = 5;

問題#2:

1>.\test.cpp(33) : error C2146: syntax error : missing ';' before identifier 'testerObject'

Testerそれが言っていることとほぼ同じです(セミコロンのエラーがない場合、セミコロンがどこにあるべきかを言うのは少し不正確になる可能性があります)-クラスの定義の後にセミコロンが必要です。

それらを修正すると、コンパイルの問題がなくなります。

重要なことは、コンパイラ エラーを上から 1 つずつ取得することです。それらの約 3 つ以上を取得した場合、最初のエラーがコンパイルを雑草にさせるだけなので、おそらく 3 つ目以降のすべてを無視することができます (実際のエラーの場合は、次のエラーで再び表示されます)。とにかくコンパイルします)。

于 2009-01-31T07:27:19.790 に答える
1
  • エラー C2864:const整数に修飾子を追加するか、初期化をクラスの外に移動します (のようにclass Tester { static int number; }; int Tester::number = 5;)。後者はあなたのケースにより適しているようです。
  • エラー C2146: の宣言の後にセミコロンがありませんclass Tester { ... }。そのはずclass Tester { ... };

他のエラーは、おそらく前のエラーが原因です。修正されると、自動的に修正されるはずです。

static余談ですが、メンバーに修飾子が本当に必要だとは思いません。インスタンスフィールドの方が適しているようです。ただし、インプレースで初期化することはできません (これは C# ではありません)。初期化をコンストラクターに移動する必要があります。例えば:

class Tester {
    int number;
    static int staticNumber; // just to show you how to use a static field

public:
    Tester() : number(5) {}
    ~Tester() {} // I suggest you remove the destructor unless you need it

    int getNumber() { return number; }
    void setNumber(int value) { number = value; }

    static int getStaticNumber() { return staticNumber; }
    static void setStaticNumber(int value) { staticNumber = value; }
};

// initialize static members *outside* the class
int Tester::staticNumber = 5;
于 2009-01-31T07:30:15.993 に答える
0

これによると:http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr038.htm

Tester testerObject;
int Tester::number = 5;

私は肯定的ではありませんが、残りのエラーはその 1 つの問題に起因すると思います。それを修正して、どこまで到達するかを確認してください。

于 2009-01-31T07:30:08.660 に答える