4 / 4 / 2
Регистрация: 17.03.2015
Сообщений: 47
1

Вызов метода класса из main

24.09.2016, 13:43. Показов 7445. Ответов 3
Метки нет (Все метки)

Как вызвать функцию plus в меин? пробовал вариант р3.=р3.plus(p1,p2), но не получилось
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
 
class Nexia {
protected: 
        int c,m;
public:
    Nexia(int clock, int minit);
    Nexia&plus(Nexia &p1, Nexia &p2);
    int Tget();
    int Mget();
};
 
int Nexia::Tget() { return c; }
int Nexia::Mget() { return m; }
Nexia(int clock, int minit) { c=clock; m=minit;}
 
Nexia&Nexia::plus (Nexia &p1, Nexia &p2) {
    Nexia p3;
    p3.c=p1.c+p2.c;
    p3.m=p2.m+p2.m;
    return p3;
}
 
void main(void)
{
    Nexia p1(10,45),p2(1,25), p3;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2016, 13:43
Ответы с готовыми решениями:

Вызов метода из vector(a) в функции main без использования вызова execute внутри класса
Добрый день столкнулся с проблемой, что просто не могу вызвать метод из вектора в функции main. Код...

Вызов метода класса из метода другого класса
Помогите школнегу Имеется несколько классов class Com { protected: unsigned char bufrd,...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp,...

Вызов метода класса без создания экземпляра класса.
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов....

3
16919 / 9102 / 2229
Регистрация: 30.01.2014
Сообщений: 15,864
24.09.2016, 14:10 2
Лучший ответ Сообщение было отмечено Athena как решение

Решение

Цитата Сообщение от Athena Посмотреть сообщение
C++
1
2
3
4
5
6
Nexia&Nexia::plus (Nexia &p1, Nexia &p2) {
    Nexia p3;
    p3.c=p1.c+p2.c;
    p3.m=p2.m+p2.m;
    return p3;
}
Тут ошибка. Нельзя возвращать ссылку на локальную переменную, т.к. ее время жизни ограничено областью функции. Надо так:
C++
1
2
3
4
5
6
Nexia Nexia::plus (Nexia &p1, Nexia &p2) {
    Nexia p3;
    p3.c=p1.c+p2.c;
    p3.m=p2.m+p2.m;
    return p3;
}
Во-вторых, функция plus весьма странная. Если она принимает оба аргумента, то по логике она должна быть статической. Но что-то подсказывает, что все же имелось в виду такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class Nexia {
protected: 
    int c,m;
public:
    Nexia(int clock, int minit);
    Nexia plus(Nexia const & p2) const;
 
    //......
};
 
Nexia Nexia::plus (Nexia const & p2) const {
    return Nexia(c + p2.c, m + p2.m);
}
Соответственно запись в main будет такой:
C++
1
2
//.....
p3 = p1.plus(p2);
При этом, чтобы работал конструктор по умолчанию для p3 (строка 29 в исходном примере), его нужно предоставить. Например добавив параметры по умолчанию:
C++
1
2
3
4
5
6
7
8
9
class Nexia {
protected: 
    int c,m;
public:
    Nexia(int clock = 0, int minit = 0);
    Nexia plus(Nexia const & p2) const;
 
    //......
};
Ну и по мелочи.
* В строке 18 забыл квалифицировать имя. Надо так:
C++
1
Nexia::Nexia(int clock, int minit) { c=clock; m=minit;}
В конструкторе лучше пользоваться списком инициализации, вместо присваивания:
C++
1
2
Nexia::Nexia(int clock, int minit) : c(clock), m(minit) 
{ }
* Геттеры должны быть const.
C++
1
2
3
4
5
6
7
8
9
10
11
class Nexia {
protected: 
    int c,m;
public:
//.....
    int Tget() const;
    int Mget() const;
};
 
int Nexia::Tget() const { return c; }
int Nexia::Mget() const { return m; }
* Помещение c и m в protected является сомнительным решением, особенно с учетом того, что для них есть геттеры.
* Функция main по стандарту возвращает int.

Кликните здесь для просмотра всего текста
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
class Nexia {
private: 
    int c, m;
public:
    Nexia(int clock = 0, int minit = 0);
    Nexia plus(Nexia const & p2) const;
    int Tget() const;
    int Mget() const;
};
 
int Nexia::Tget() const { return c; }
int Nexia::Mget() const { return m; }
 
Nexia::Nexia(int clock, int minit) 
    : c(clock), m(minit) 
{ }
 
 
Nexia Nexia::plus(Nexia const & p2) const {
    return Nexia(c + p2.c, m + p2.m);
}
 
int main()
{
    Nexia p1(10,45), p2(1,25), p3;
    
    p3 = p1.plus(p2);
}
1
4 / 4 / 2
Регистрация: 17.03.2015
Сообщений: 47
24.09.2016, 14:40  [ТС] 3
* Геттеры должны быть const.
а почему?
0
16919 / 9102 / 2229
Регистрация: 30.01.2014
Сообщений: 15,864
24.09.2016, 14:47 4
Цитата Сообщение от Athena Посмотреть сообщение
а почему?
Ну например, сделаешь ты свой объект Nexia константой. И все, геттерами пользоваться не сможешь:
C++
1
2
3
4
    const Nexia p3 = p1.plus(p2);
    
    std::cout << p3.Tget() << std::endl; // будет ошибка, если Tget не const
    std::cout << p3.Mget() << std::endl; // будет ошибка, если Mget не const
Хотя по сути ничто этому не мешает. Ведь геттеры не меняют состояние объекта, а значит должны быть const.

Добавлено через 2 минуты
Athena, в общем, книжку вот посоветую, для старта: Стандарты программирования на C++.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2016, 14:47
Помогаю со студенческими работами здесь

Вызов метода внутреннего класса методом внешнего класса
Не могу разобраться как реализовать вложенный класс и как его вызвать. Занимаюсь по Лафоре, про...

Вызов динамического метода класса по указателю на объект класса
Как это можно сделать? И хотелось бы как можно проще.

Вызов методов класса в функцию main()
#include &lt;iostream&gt; using namespace std; class Person { public: char name; int age; void...

Вызов метода базового класса из класса-потомка
Нужно вызывать из метода, переопределенного в потомке, соответствующий метод базового класса. При...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru