Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
1

Статические методы

09.08.2019, 14:56. Показов 2825. Ответов 11

Приведите, пожалуйста, пример кода или еще какой-нибудь как должен я написать этот статический метод:

Разработать консольное приложение, в котором:
1 Создать массив из шести объектов (по два каждого производного класса).
2 Вывести объекты на консоль через ToString().
3 Отсортировать объекты по убыванию.
4 Вывести объекты на консоль через ToString().

В задаче 2 пункты 2 и 4 совпадают. Следовательно, реализацию нужно выносить в статический метод.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.08.2019, 14:56
Ответы с готовыми решениями:

Статические методы
Доброго времени суток! Проблема такова: имеется класс, содержащий в себе статический компонент -...

Статические поля и методы
Ни как не могу понят что же такое статические поля и методы, и какое их принципиальное отличие от...

Статические методы класса (static)
Доброго времени суток! Читаю "Решение сложных задач С++ - Саттер", у него есть такая задача: вы...

Статические методы (сложение полиномов)
Всем доброго дня! Собственно, хочу попросить помощи.. написал код, статический метод для сложения...

11
359 / 226 / 120
Регистрация: 25.06.2019
Сообщений: 830
09.08.2019, 15:14 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class A
{
    int a,b;
    public:
    A()
    {
        a=1;
        b=2;
    }
    A(int a,int b)
    {
        this->a=a;
        this->b=b;
    }
    static int Sum(A *a)
    {
        return a->a+a->b;
    }
    void ToString()
    {
        cout<<"a="<<a<<" b="<<b<<endl;
    }
};
 
void main(int argc,char **argv)
{
    A *a=new A(7,3);
    cout<<A::Sum(a)<<endl;
    a->ToString();
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 15:20  [ТС] 3
Pvt, что-то не очень понятно... Вот я понимаю, что такое статические переменные, но в чем прикол статических методов? Типа вот по твоему примеру я потом убрал static, немного изменил main и, естественно, все работало как надо. Просто я не могу понять в чем выгода что-ли от использования этих методов?
0
Don't worry, be happy
17173 / 10056 / 1935
Регистрация: 27.09.2012
Сообщений: 25,053
Записей в блоге: 1
09.08.2019, 15:30 4
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Следовательно, реализацию нужно выносить в статический метод.
Зачем?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
struct Base
{
     virtual std::String ToString() const = 0;
     //...
};
 
struct First: Base
{
    std::String ToString() const;
    //...
};
 
 
struct Second: Base
{
    std::String ToString() const;
    //...
};
 
 
//...
void foo(Base * p)
{
    std::cout << p->ToString();
}
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 15:31  [ТС] 5
Это задание такое. Я реализовал все без статического метода. А потом сел и подумал, а как же теперь передалать все под статический?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.08.2019, 15:32 6
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Просто я не могу понять в чем выгода что-ли от использования этих методов?
Тем, что у static методов нету this указателя. Т.е. они как бы не часть класса, хотя находятся в его пространстве имен.
Можно использовать например для той же lazy init.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Тот же синглетон Мейерса.
class singleton
{
public: 
    static singleton const& instance() {
        static singleton instance;
        return instance; 
    }
private:
    singleton()= default;
    ~singleton()= default;
    singleton(singleton const&)= delete;
    singleton& operator=(singleton const&)= delete;
};
// ...
auto the_only_one_obj = singleton::instance();
Одиночка (шаблон проектирования)
0
359 / 226 / 120
Регистрация: 25.06.2019
Сообщений: 830
09.08.2019, 15:36 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    static int SumArr(A *a[],int n)
    {
        int sum=0;
        for(int i=0; i<n; i++)
            sum+=a[i]->a+a[i]->b;
        return sum;
    }
};
 
void main(int argc,char **argv)
{
    A **arr=new A*[2];
    arr[0]=new A(5,6);
    arr[1]=new A(8,9);
    cout<<A::SumArr(arr,2)<<endl;
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 15:48  [ТС] 8
Окей. Тогда такой вопрос: есть три класса, один из них родительский(допустим это будет class A), он абстрактный. Есть два наследника(class B & class C соответственно). У class А есть метод ToString, который наследуют его потомки. Вот вопрос: мне нужно этот метод сделать статическим, исходя из условия, или ошибаюсь?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
09.08.2019, 15:59 9
Zohan_LV, зависит от реализации, но скорее - ошибаетесь.
0
зомбяк
1533 / 1178 / 332
Регистрация: 14.05.2017
Сообщений: 3,824
09.08.2019, 16:17 10
Цитата Сообщение от Zohan_LV Посмотреть сообщение
Вот вопрос: мне нужно этот метод сделать статическим
Статический метод и наследуемый метод - это разные методы. Но если они имеют одинаковую сигнатуру, то тот, который ниже по иерархии, скроет имя того, который выше.

Добавлено через 1 минуту
Естественно объект статическому методу не передаётся никак (только если через аргументы), вызвать в статическом методе поле класса тоже нельзя.
0
0 / 0 / 0
Регистрация: 08.08.2019
Сообщений: 13
09.08.2019, 16:20  [ТС] 11
Подскажите тогда какой метод я должен сделать статических или добавить исходя из условий, описанных в самом вопросе?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
class Commodity
{
private:
 
    string goodsName;
 
    double cost;
 
public:
 
    Commodity()
    {
        cin.ignore(cin.rdbuf()->in_avail());
 
        cout << "Enter goods name: ";
 
        getline(cin, goodsName);
 
        cout << "Enter cost (BYN): ";
 
        cin >> cost;
    }
 
    Commodity(string tmpGoodsName, double tmpCost) : goodsName(tmpGoodsName), cost(tmpCost) {}
 
    string ToString()
    {
        string str = "Name: " + goodsName + "; " + "Cost: " + to_string(cost).erase(to_string(cost).size() - 4) + "(BYN); ";
 
        return str;
    }
};
 
class AbstaractPurchase
{
private:
 
    Commodity goods;
 
    uint64_t countOfGoods;
 
public:
 
    AbstaractPurchase()
    {
        cin.ignore(cin.rdbuf()->in_avail());
 
        cout << "Enter count of goods: ";
 
        cin >> countOfGoods;
    }
 
    AbstaractPurchase(string tmpGoodsName, double tmpCost, uint64_t tmpCountOfGoods) : countOfGoods(tmpCountOfGoods)
    {
        goods = Commodity(tmpGoodsName, tmpCost);
    }
 
    virtual ~AbstaractPurchase() = default;
 
    virtual double GetPurchase() = 0;
 
    virtual string ToString()
    {
        string str = goods.ToString() + "Count of goods: " + to_string(countOfGoods) + "; ";
 
        return str;
    }
 
    virtual bool CompareTo(AbstaractPurchase& purchase)
    {
        return GetPurchase() < purchase.GetPurchase();
    }
};
 
class FirstDerivedPurchase : public AbstaractPurchase
{
public:
 
    inline double GetPurchase() override
    {
        // если стоимость товара более 10 BYN - скидка 15 %
 
        if (GetCost() > 10)
        {
            return((GetCost() - (15 * GetCost() / 100)) * GetCountOfGoods());
        }
        else
        {
            return (GetCost() * GetCountOfGoods());
        }
    }
 
    string ToString() override
    {
 
        string str = AbstaractPurchase::ToString() + "Purchase price: " + to_string(GetPurchase()).erase(to_string(GetPurchase()).size() - 4) + "(BYN); ";
 
        cout << "Info about purchase: " << endl << str;
 
        return str;
    }
};
 
class SecondDerivedPurchase : public AbstaractPurchase
{
private:
 
    const uint16_t numberForSale = 5;
 
public:
 
    inline double GetPurchase() override
    {
        // если кол-во товара более 5 - скидка 15 %
 
        if (GetCountOfGoods() > numberForSale)
        {
            return((GetCost() - (15 * GetCost() / 100)) * GetCountOfGoods());
        }
        else
        {
            return (GetCost() * GetCountOfGoods());
        }
    }
 
    string ToString() override
    {
        string str = AbstaractPurchase::ToString() + "Purchase price: " + to_string(GetPurchase()).erase(to_string(GetPurchase()).size() - 4) + "(BYN); ";
 
        cout << "Info about purchase: " << endl << str;
 
        return str;
    }
};
 
class ThirdDerivedPurchase : public AbstaractPurchase
{
 
public:
 
    inline double GetPurchase() override
    {
        double tmp = ((GetCost() * GetCountOfGoods()) + GetFare());
 
        fare = to_string(tmp).erase(to_string(tmp).size() - 4) + "(BYN); ";
 
        return tmp;
    }
 
    string ToString() override
    {
        GetPurchase();
 
        string str = AbstaractPurchase::ToString() + "Purchase price: " + fare;
 
        cout << "Info about purchase: " << endl << str << endl;
 
        return str;
    }
};
0
359 / 226 / 120
Регистрация: 25.06.2019
Сообщений: 830
09.08.2019, 16:50 12
Цитата Сообщение от Zohan_LV Посмотреть сообщение
в чем выгода что-ли от использования этих методов?
класс вообще может не иметь своих экземпляров
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class MathGr
{
    public:
    static double ASin(double x)
    {
        return asin(x)*180/M_PI;
    }
    static double ACos(double x)
    {
        return acos(x)*180/M_PI;
    }
    static double ATan(double x)
    {
        return atan(x)*180/M_PI;
    }
};
void main(int argc,char **argv)
{
    double x=1;
    cout<<MathGr::ACos(x)<<" "<<MathGr::ASin(x)<<" "<<MathGr::ATan(x)<<endl;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.08.2019, 16:50

Статические методы класса. (Связный список)
Добрый день, такая проблема, работаю со связным списком. Учусь. С обычными типами данных всё...

Статические элементы класса. Inline-методы. (Решение задачи)
Пусть класс Maket описан следующим образом: #include &lt;iostream.h&gt; class Maket { private: int m;...

Класс "Матрица". Ввести статические методы
Это моя программа, в ней нужно переделать методы в методы типа static Честное слово не знаю как...

Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…). Определить другие методы
Разработать классы для описанных ниже объектов. Включить в класс методы set (…), get (…), show (…)....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.