Функции-члены C ++ - PullRequest
       5

Функции-члены C ++

0 голосов
/ 29 апреля 2018

Я пытаюсь написать простую программу, которая записывает дату. Эта программа использует структуру с именем Date. Внутри структуры есть параметризованный конструктор Date. Конструктор также проверяет, является ли дата приблизительно действительной (убедитесь, что месяцы находятся в диапазоне от 1 до 12, а дни - от 1 до 31). Последующее назначение решает проблемы с этим типом проверки.

Также в Struct есть функция add_day. Вот где у меня проблемы. Кажется, я не могу вызвать переменные структуры к функции, чтобы добавить день.

struct Date
{
    int y, m, d;

  public:
    Date(int y, int m, int d);

    void add_day(int n);

    int month()
    {
        return m;
    }

    int day()
    {
        return d;
    }

    int year()
    {
        return y;
    }
};

/// main program calls the struct and add day function with parameters.
int main()
{
    Date today(1978, 6, 26);
    today.add_day(1);

    keep_window_open();
    return 0;
}

// Function definition for the Constructor. Checks values to make sure they
are dates and then returns them.
Date::Date(int y, int m, int d)
{

    if ((m < 1) || (m > 12))
        cout << "Invalid Month\n";
    if ((d < 1) || (d > 31))
        cout << "Invalid Day\n";
    else
        y = y;

    m = m;
    d = d;

    cout << "The date is " << m << ',' << d << ',' << y << endl;

    // This function will accept the integers to make a date
    // this function will also check for a valid date
}

void Date::add_day(int n)
{
    // what do I put in here that will call the variables in Date to be
    // modified to add one to day or d.
};

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Переменные-члены доступны в функциях-членах и конструкторе неявно, если обращаться к ним по имени (y, m, d) или явно по указателю this (this->y, this->m, this->d).

Например, для добавления дня:

void Date::add_day(int n)
{
    d += n; // Modifies the 'd' member variable
    // ... below here we must handle what 
    // happens when the number of days exceeds t
    // he number of days in the particular month.
};

У вас также есть проблема в конструкторе. Потому что переменные аргумента конструктора имеют одинаковые имена с переменными-членами. Например: m = m; d = d;

При этих присваиваниях компилятор будет предполагать, что вы хотите присвоить локальную переменную аргумента локальной переменной аргумента аргумента. Таким образом, вы фактически не присваиваете переменной-члену никакого значения вообще. Одним из решений является явное указание их следующим образом this->m = m; this->d = d; То же самое касается переменной y.

0 голосов
/ 29 апреля 2018

Вы можете ссылаться на переменные-члены класса внутри его функций-членов, просто называя их, например ::

.
void Date::add_day(int n)
{
    d += n;
}

Здесь d будет ссылаться на переменную-член int d, которую вы объявили поверх своего фрагмента:

struct Date
{
    int y, m, d;

    // ...
}

Однако, вероятно, вас смущает затенение переменных-членов. Также обратите внимание, что у вас есть другие проблемы с дизайном и несколько способов улучшить ваш код. Взгляните на эту версию для вдохновения:

#include <iostream>
#include <stdexcept>

class Date
{
    int year_, month_, day_;

public:
    explicit Date(int year, int month, int day)
        : year_(year), month_(month), day_(day)
    {
        if (month_ < 1 || month_ > 12)
            throw std::logic_error("Invalid Month");
        if (day_ < 1 || day_ > 31)
            throw std::logic_error("Invalid Day");
    }

    void add_days(int days) { /* ... */ }

    int year() const { return year_; }
    int month() const { return month_; }
    int day() const { return day_; }
};

std::ostream & operator<<(std::ostream & os, const Date & date)
{
    return os << date.year() << '-' << date.month() << '-' << date.day();
}

int main()
{
    Date date(1978, 6, 26);
    date.add_days(1);
    std::cout << date << '\n';
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...