Это последующий пост от Instance-level encapsulation with C++.Частные члены класса не полностью инкапсулированы?
Я определил класс и создал два объекта из этого класса.
#include <iostream>
#include <ctime>
#include <string>
using namespace std;
class timeclass {
private:
string date;
time_t gmrawtime, rawtime;
struct tm * timeinfo;
char file_date[9];
void tm_init(int);
public:
timeclass(int);
void print_date();
};
void timeclass::tm_init(int y) {
timeinfo = gmtime(&rawtime);
timeinfo->tm_year = y - 1900; // timeinfo->tm_year holds number of years since 1900
timeinfo->tm_mon = 0;
timeinfo->tm_mday = 1;
timeinfo->tm_hour = 0;
timeinfo->tm_min= 0;
timeinfo->tm_sec= 0;
}
timeclass::timeclass(int y) {
timeclass::tm_init(y);
gmrawtime = mktime(timeinfo) - timezone;
}
void timeclass::print_date() {
strftime(file_date,9,"%Y%m%d",timeinfo);
date = string(file_date);
cout<<date<<endl;
}
/* -----------------------------------------------------------------------*/
int main()
{
timeclass time1(1991);
timeclass time2(1992);
time1.print_date(); // Prints 19920101, despite being initialized with 1991
time2.print_date(); // Prints 19920101, as expected
return 0;
}
Этот пример является частью счетчика даты и нарезанные кубиками из моей основной программы, но она иллюстрирует мою точку зрения. Я хочу, чтобы счетчик дат работал для каждого экземпляра класса (time1 и time2), но он выглядит так, как только я создаю объект time2, переменная «timeinfo», которая, как я думала, была инкапсулирована во время1, перезаписывается конструктором time2.
Я знаю, что C++ поддерживает только инкапсуляцию на уровне класса, и мне интересно, связана ли моя проблема с тем, что члены одного класса имеют доступ к частным членам друг друга. Есть ли способ обойти это, чтобы я мог достичь того, что хочу? Спасибо, Тейлор
Избегайте делать 'используя патезрасе;'. См. [Здесь] (http://stackoverflow.com/questions/1452721/why-is-using-namespace-std-considered-a-bad-practice-in-c) для объяснения. – AxelOmega
Спасибо @AxelOmega, я приветствую любые намеки, так как я не эксперт в этом. Вы предложили бы исключить «using namespace std;» вообще, а затем просто вызвать std :: cout (и другие функции, кроме cout) явно? – Taylor
Да 'std :: cout' - это нормально. Это то же, что и в большинстве кодов C++. Вы также можете использовать 'using std :: cout', если вы чувствуете, что не можете набрать еще пять символов. Но 'std ::' становится рефлексом через некоторое время. – AxelOmega