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. 以及如何解决“只能在类中初始化静态 const 整数数据成员”
  3. 基本上我该如何修复其余的错误,以便编译它?

我喜欢在文件范围内声明全局类对象(我喜欢在文件范围内声明所有全局变量),因为当我必须创建单独的源文件并执行“extern”时,一切都会变得非常复杂,对我来说永远不起作用。虽然,我确实想最终弄清楚如何做到这一点......似乎我看到的每个教程都不会编译,除非它编译,否则我不知道如何重新创建它!

如果我可以编译它......那么我可以成功地学习如何做到这一点。因此,如果有人可以将上面的内容重写为它从字面上复制并粘贴到 Visual C++ Express 2008 中并且可以工作的地方,我最终将能够弄清楚如何重新创建它。看到这个问题的解决方案,我感到非常兴奋!只是我无法让全局对象正常工作!欢迎任何其他关于声明全局类对象的信息......或任何与此相关的信息!

4

4 回答 4

11

只需开始一一解决错误。很多错误只是从最初的错误级联而来,所以当只有几个错误时,看起来会有很多问题。只需从顶部开始:

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

您不能在类定义中初始化成员,除非它是静态、常量和其中一种整数类型。将“ = 5”从声明中去掉number。然后你需要有一个Tester::number类定义之外的定义,如下所示:

int Tester::number = 5;

问题2:

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

几乎就是它所说的(缺少分号错误可能有点不准确地说明分号应该在哪里) - 在Tester类的定义之后需要一个分号。

解决这些问题,您的编译问题就会消失。

关键是尝试从顶部一次处理一个编译器错误。如果你得到超过 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;

我不是很肯定,但我认为其余的错误都来自那个问题。解决这个问题,看看它能让你走多远。

于 2009-01-31T07:30:08.660 回答
0

此处已有的答案涉及您的代码无法编译的原因以及如何纠正该问题。但是,我对您对“外部”的评论很感兴趣。当您知道如何使用时,它非常容易使用。您在一个标头中声明了外部变量。然后你在一个文件中初始化它。任何其他文件都可以通过包含标题来引用该变量。例如

标头.h:

// ensure the file is only included once
#ifndef _HEADER_H
#define _HEADER_H

extern int foo;

#endif
// end file header.h

头文件.cpp

#include "header.h"

int foo = 1;

// end file header.cpp

主文件

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

int main(int argc, char** argv)
{
  printf("%d", foo);
  return 0;
}

// end file main.cpp

虽然对全局变量使用静态类成员有助于适应 oo 设计方案,但它比必要的更复杂。如果您不必严格遵循oo,只需使用extern,它更容易且代码更少。

于 2009-01-31T14:31:03.303 回答