C++ 无法从类数组访问数组

C++ 无法从类数组访问数组,c++,C++,我发现我的程序有一些bug,原因是我可以从类数组中访问数据 这是课程代码 void Date::initialize(){ string monthNames[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; int monthDays[] = {31, 28, 31, 30, 31, 30,

我发现我的程序有一些bug,原因是我可以从类数组中访问数据

这是课程代码

void Date::initialize(){
string monthNames[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int monthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
};
这是头文件Date.h,上面的代码存储在Date.cpp中,并使用main.cpp加载它

class Date{
private:
int day;
int month;
int year;
string monthNames[12];
int monthDays[12];
您可以创建一个本地数组,该数组是逻辑的,因为您只能使用大括号初始化数组,而不能指定给它。所以您创建了一个本地数组。现在,您需要将其复制到实际成员,即
this->monthNames
。另一个数组也是如此。看看这个函数。如果不允许使用stl算法,可以使用良好的旧for循环进行复制


您可以创建一个本地数组,该数组是逻辑的,因为您只能使用大括号初始化数组,而不能指定给它。所以您创建了一个本地数组。现在,您需要将其复制到实际成员,即
this->monthNames
。另一个数组也是如此。看看这个函数。如果不允许使用stl算法,可以使用良好的旧for循环进行复制。

您刚刚定义了局部变量,因此必须复制它们的数据以初始化类属性

void Date::initialize(){
    // make the data static not to initialize them every time this function is called
    static string monthNamesData[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    static int monthDaysData[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for (size_t i = 0; i < sizeof(monthNames) / sizeof(*monthNames); i++){
        monthNames[i] = monthNamesData[i];
    }
    for (size_t i = 0; i < sizeof(monthDays) / sizeof(*monthDays); i++){
        monthDays[i] = monthDaysData[i];
    }
}
void Date::initialize(){
//使数据保持静态,以避免每次调用此函数时都对其进行初始化
静态字符串MonthNameData[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
静态int monthDaysData[]={31,28,31,30,31,30,30,31,31,30,31,30,31};
对于(size_t i=0;i
您刚刚定义了局部变量,因此必须复制它们的数据以初始化类属性

void Date::initialize(){
    // make the data static not to initialize them every time this function is called
    static string monthNamesData[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
    static int monthDaysData[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    for (size_t i = 0; i < sizeof(monthNames) / sizeof(*monthNames); i++){
        monthNames[i] = monthNamesData[i];
    }
    for (size_t i = 0; i < sizeof(monthDays) / sizeof(*monthDays); i++){
        monthDays[i] = monthDaysData[i];
    }
}
void Date::initialize(){
//使数据保持静态,以避免每次调用此函数时都对其进行初始化
静态字符串MonthNameData[]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
静态int monthDaysData[]={31,28,31,30,31,30,30,31,31,30,31,30,31};
对于(size_t i=0;i
数组
monthNames
monthDays
被声明为成员函数
initialize

void Date::initialize(){
string monthNames[] = 
^^^^^^^^^^^^^^^^^^^
{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int monthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
^^^^^^^^^^^^^^^
};
退出函数后,它们将被销毁

试试看

#include <array>

//...

class Date{
private:
int day;
int month;
int year;
std::array<string, 12> monthNames;
std::array<int, 12> monthDays;

//...

void Date::initialize(){
monthNames = { {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} };
monthDays = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
};
#包括
//...
上课日期{
私人:
国际日;
整月;
国际年;
std::数组monthNames;
std::数组monthDays;
//...
无效日期::初始化(){
monthNames={{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
月日={31,28,31,30,31,30,31,31,30,31,31,31};
};

数组
monthNames
monthDays
被声明为成员函数
initialize

void Date::initialize(){
string monthNames[] = 
^^^^^^^^^^^^^^^^^^^
{"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int monthDays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
^^^^^^^^^^^^^^^
};
退出函数后,它们将被销毁

试试看

#include <array>

//...

class Date{
private:
int day;
int month;
int year;
std::array<string, 12> monthNames;
std::array<int, 12> monthDays;

//...

void Date::initialize(){
monthNames = { {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"} };
monthDays = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };
};
#包括
//...
上课日期{
私人:
国际日;
整月;
国际年;
std::数组monthNames;
std::数组monthDays;
//...
无效日期::初始化(){
monthNames={{“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”};
月日={31,28,31,30,31,30,31,31,30,31,31,31};
};

私有成员变量只能由公共成员函数在其类外访问(但此函数的声明必须在类内,我认为您已经这样做了)。您的initialize()函数是公共的吗?因为我不这么认为。对于类,默认情况下所有内容都是私有的,因此请确保您的initialize()函数在类内声明,但在公共标题下。

私有成员变量只能通过公共成员函数在其类外访问(但此函数的声明必须在类内,我认为您已经这样做了)。是否初始化()函数public?因为我不这么认为。对于类,默认情况下所有内容都是私有的,因此请确保您的initialize()声明在类内,但在public标题下。

您初始化了两个本地数组并将其丢弃。如何解决它?程序的要求是必须使用initialize()要初始化数组–monthNames和monthDays您初始化了两个本地数组并将它们扔掉。如何解决?程序的要求是必须使用initialize()初始化数组–monthNames和monthDays