2016-03-04 3 views
0

я обнаружил, что моя программа есть какая-то ошибка, причина в том, что я могу получить доступ к данным из класса массиване может получить доступ к массиву из класса массива

ЗДЕСЬ класс код

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]; 
+3

Вы инициализировали два локальных массива и выбрасывали их. – MikeCAT

+0

как его решить? Требование программы должно использовать initialize() для инициализации массивов - monthNames и monthDays –

ответ

2
void Date::initialize() 
{ 
    string monthNames[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"}; 
    copy(monthNames, monthNames + 12, this->monthNames); 
} 

Вы можете создать локальный массив, что логично, потому что вы можете только инициализировать массив с фигурными скобками, а не назначать ему. Таким образом, вы создаете локальный массив. Теперь вам нужно скопировать его в действительный член, который равен this->monthNames. То же самое для другого массива. Взгляните на функцию copy. Если вам не разрешено использовать stl-алгоритмы, вы можете скопировать, используя старый добрый цикл.

2

Вы только что определили локальные переменные, поэтому вам нужно скопировать их данные для инициализации свойств класса.

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]; 
    } 
} 
1

Массивы 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} }; 
}; 
1

Частные переменные-члены могут быть доступны только за пределами своего класса с помощью функции PUBLIC члена (но декларация этой функции должна быть внутри класса, который я думаю, что вы сделали). Является ли функция initialize() общедоступной? потому что я так не думаю. В случае классов все ЧАСТИЧНО ПО УМОЛЧАНИЮ, поэтому убедитесь, что ваш initialize() объявлен внутри класса, но под заголовком PUBLIC.