1 Востаннє редагувалося Anddep (06.06.2013 14:35:33)

Тема: Статичні функції та змінні в класі!

Привіт!
Завдання

Прихований текст

Створити клас, що асоціюється з кутовими величинами та підтримує операції додавання,віднімання,ініціалізацію,видачу значення об'єкту в радіанах та градусах ( використайте статичні змінні та функції для збереження, вводу та виводу коефіцієнту пропорційності).

Мій скелет

Прихований текст
#include<iostream>
using namespace std;
const static double z=1;
static void Func()
{
    cout<<z;
}
class T
{
public:

    double k1,k2;

    double Sum();
    double Riz();
    static void Func();



    T::Riz()
    {
    }
    T::Sum()
    {
    }

};

int main()
{    

    Func();
    return 0;
}

Допоможіть розібратись з цим завданням!
Чи правильно я оголошую та використовую статичну функцію та змінну, бо як я зрозумів її ввести я не можу?
Як правильно написати функції ініціалізації, та видачі значення об'єкту? ( теж саме щодо градусів і радіан? це мають бути окремі ф-ції?)

2 Востаннє редагувалося koala (06.06.2013 16:43:25)

Re: Статичні функції та змінні в класі!

Ні, неправильно. Читаємо завдання:

Anddep написав:

Створити клас, що асоціюється з кутовими величинами та підтримує операції додавання,віднімання,ініціалізацію,видачу значення об'єкту в радіанах та градусах ( використайте статичні змінні та функції для збереження, вводу та виводу коефіцієнту пропорційності).

Раджу все це переписати як коментар в код, і розбивати це на шматки навколо тих конструкцій, які це реалізовують. Наприклад:

//клас, що асоціюється з кутовими величинами
class T
{
  //операції додавання
  double Sum();
  //віднімання
  double Riz();

і т.д.

Одразу пораджу:
- в цій задачі не оголошуйте ніяких змінних і функцій(крім main) поза класом. Це допоможе краще зрозуміти, чого від вас хочуть.
- не оголошуйте публічних змінних. Ніколи. Це порушує інкапсуляцію.
- перевантажуйте оператори замість проголошення функцій, якщо вони мають схожий на стантартні операції сенс.
- давайте типам, функціям і змінним зрозумілі імена. Що таке T? Що таке k1,k2? Що таке Func? Якщо клас описує кут, то так його і звіть - Angle чи, кінець-кінцем, Kut. Вам самому буде легше.
- бажано оголошувати клас в окремому файлі.

Подякували: Replace, Очі.завидющі, DOP, Cyan4

3 Востаннє редагувалося Anddep (06.06.2013 18:27:08)

Re: Статичні функції та змінні в класі!

#include <iostream>
using namespace std;
class angle
{
private:
    int degree;
    int rad;
    int k_to_rad;            //коефіцієнт переведення
public:
    angle () {        //конструктор 
        this->k_to_rad = 1/57;
        this->degree = 0;
        this->rad = degree * k_to_rad;
    }
    angle (int _degree){        //конструктор
        this->k_to_rad = 1/57;
        if (_degree < 0) {
            this->degree = 0;
        }
        else {
            this->degree = _degree;
        }
        this->rad = degree * k_to_rad;
    }
    ~angle() {}                //дeструктор
    void put_k (int _k) {
        this->k_to_rad = _k;
    }
    void Initial (int _degree){    // функція для шніціалізації даних
        if (_degree < 0) {
            this->degree = 0;
        }
        else {
            this->degree = _degree;
        }
        this->rad = degree * k_to_rad;
    }
    //повернення в градусах
    int get_in_degree(){
        return this->degree;
    }
    //повернення в радіанах
    int get_in_rad(){
        return this->rad;
    }
    void operator=(angle& ROperand){
        this->degree = ROperand.degree;
        this->rad = ROperand.rad;
    }
    //перевантажений оператор додавання
    angle& operator+(angle& ROperand){
        angle* tmp = new angle();
        tmp->degree = this->degree + ROperand.degree;
        tmp->rad = this->rad + ROperand.rad;
        return *tmp;
    }
    //перевантажений оператор віднімання
    //при відємному результаті поверне 0
    angle& operator-(angle& ROperand){
        angle* tmp = new angle();
        if (this->degree - ROperand.degree < 0) {
            return 0;
        }
        else {
            tmp->degree = this->degree - ROperand.degree;
            tmp->rad = this->rad - ROperand.rad;
            return *tmp;
        }
    }
    virtual void Druk (){
        cout << "angle : \n" << "proportionality factor degree to rad : " <<  this->k_to_rad << endl;
        cout << "in degree : " << this->degree << "\tin rad : " << this->rad << endl;
    }
}

Ось, переписав.)
Щось вийшло)

4

Re: Статичні функції та змінні в класі!

Не буду особливо лізти всередину коду; там є, наприклад, витікання пам'яті, але то дрібниці, ну й незрозуміло, чому значення кута int, коли вони очевидно мають бути нецілими.
А от що треба - то це, цитую,

використайте статичні змінні та функції для збереження, вводу та виводу коефіцієнту пропорційності

Наприклад, k_to_rad - він же один на всіх, правильно? Не можуть в одного кута бути Пі радіанів в 180 градусах, а в іншого 2Пі? Ну то він має бути статичним.

5

Re: Статичні функції та змінні в класі!

а хіба можна в класі оголошувати ось так?

static int k_to_rad;

Щодо типів значень, то вони будуть всі double

6

Re: Статичні функції та змінні в класі!

Anddep написав:

а хіба можна в класі оголошувати ось так?

static int k_to_rad;

Щодо типів значень, то вони будуть всі double

Можна, однак при цьому ви ще мусите додатково у файлі реалізації (.cpp) додатково визначити змінну:

//A.h
class A()
{
    static int x;
};
//A.cpp
int A::x = 0;

7

Re: Статичні функції та змінні в класі!

Anddep написав:

а хіба можна в класі оголошувати ось так?

static int k_to_rad;

А хто заборонить?
Тільки треба врахувати, що це тільки декларує наявність такого поля, а ще цю змінну треба створити окремо:

static int angle::k_to_rad;