不允许使用C++数据成员初始值设定项

C++ data member initializer is not allowed

本文关键字:C++ 数据成员 不允许      更新时间:2023-10-16

我对C++完全陌生,所以请耐心等待。我想创建一个带有静态数组的类,并从main访问该数组。这是我想在 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;
}

但我得到了:智能感知:不允许使用数据成员初始值设定项

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

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

类定义定义接口,该接口独立于实现

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

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

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

必须在类定义之外定义arr,并在类定义之外对其进行初始化。 应从声明中删除初始值设定项,并在类之后删除以下内容:

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

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

另请注意,并非 Visual Studio 中的"错误列表"中显示的所有错误都是生成错误。 值得注意的是,以"智能感知:"开头的错误是智能感知检测到的错误。 智能感知和编译器并不总是一致的。

您必须在

类声明之外初始化静态成员:

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