12

我对 C++ 完全陌生,所以请耐心等待。我想用一个静态数组创建一个类,并从主数组访问这个数组。这是我想在 C# 中做的事情。

   namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                Class a = new Class();
                Console.WriteLine(a.arr[1]);

            }
        }
    }

    =====================

    namespace ConsoleApplication1
    {
        class Class
        {       
            public static string[] s_strHands = new string[]{"one","two","three"};
        }
    }

这是我尝试过的:

// justfoolin.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;

class Class {

  public:
      static string arr[3] = {"one", "two", "three"};
};


int _tmain(int argc, _TCHAR* argv[])
{
    Class x;
    cout << x.arr[2] << endl;
    return 0;
}

但我得到了:IntelliSense:不允许数据成员初始化程序

4

4 回答 4

18

您需要稍后执行初始化;您不能在类定义中初始化类成员。(如果可以,那么在头文件中定义的类将导致每个翻译单元定义自己的成员副本,从而使链接器变得一团糟。)

class Class {
  public:
      static string arr[];
};

string Class::arr[3] = {"one", "two", "three"};

类定义定义了与实现分开的接口

于 2012-06-07T16:36:51.323 回答
2

您必须在类之外初始化静态成员,就好像它是一个全局变量一样,如下所示:

class Class { 

  public: 
      static string arr[3];
}; 

string Class::arr = {"one", "two", "three"}; 
于 2012-06-07T16:38:16.833 回答
1

只能在类定义中初始化静态的整数类型数据成员。您的静态数据成员类型为string,因此无法内联初始化。

您必须在类定义 arr之外进行定义,并在那里对其进行初始化。您应该从声明中删除初始化程序,并在您的课程之后删除以下内容:

string Class::arr[3] = {"one", "two", "three"};

如果您的类是在头文件中定义的,则其静态数据成员应仅在一个源 (.cpp) 文件中定义。

另请注意,并非所有出现在 Visual Studio 错误列表中的错误都是生成错误。值得注意的是,以“IntelliSense:”开头的错误是 IntelliSense 检测到的错误。IntelliSense 和编译器并不总是一致。

于 2012-06-07T16:37:26.390 回答
0

您必须在类声明之外初始化您的静态成员:

string Class::arr[3] = {"one", "two", "three"};
于 2012-06-07T16:38:12.057 回答