Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39

Вызов функций другого класса

10.02.2013, 22:42. Показов 1547. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Возможно, что-то подобное моей проблеме уже обсуждалось, но погуглив пару часов, ничего не нашел. Ситуация в следующем: хочу реализовать "длинную" арифметику. Не спрашивайте зачем и не говорите, что есть уже готовое. Интересно самому.

Имеется класс (LongMath), в котором я хочу реализовать 4 арифметичесмкие действия (функции LongAdd,LongSub и т.д.).Ему на вход подается:
matrix[i][j]=new LongMath(nCell[i][j]);
matrix описан в хедере основного файла:
LongMath *matrix[8][8];

а nCell[i][j] - объект типа CString.

В LongMath определены несколько переменных, которые заполняются при вызове функции PrepareValue():
matrix[i][j]->PrepareValue();
А предполагаемая функция сложения имеет вид void LongAdd(LongMath *x1,LongMath *x2);

В общем, все "типа" работает. После "заполняющего" цикла имеем 4 объекта класса LongMath (матрица 2х2).
Но когда я захотел вызвать функцию сложения, начались сложности.
Попытка лобового вызова LongAdd(matrix[0][0],matrix[0][0]) заканчивается закономерной ошибкой error C3861: 'LongAdd': identifier not found.
строка LongMath::LongAdd(matrix[0][0],matrix[0][0]); дает error C2352: 'LongMath::LongAdd' : illegal call of non-static member function
LongMath->LongAdd(matrix[0][0],matrix[0][0]); дает error C2143: syntax error : missing ';' before '->'

После многих попыток (в теме я совсем зеленый) было найдено 2 потенциальных решения.
1. Описать функции в теле основной программы и вызывать их в виде LongAdd(matrix[0][0],matrix[0][0]). Смутило, что они к самой программе прямого отношения не имеют, и файл CMainWnd.cpp становится совсем уж некошерным. Хотел ведь всю "матиематику" с "длинными" числами вынести в отдельный класс.
2. Написал в теле CMainWnd LongMath *xxx; и вызываю сложение в виде xxx->LongAdd(matrix[0][0],matrix[0][0]);., но тогда при компиляции появляется предупреждение: warning C4700: uninitialized local variable 'xxx' used, что логично.

Направьте плз на путь истиный...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.02.2013, 22:42
Ответы с готовыми решениями:

Вызов метода другого класса (не родительского)
Есть форма - Form1 Есть отдельный класс ZPanel : public Panel (модифицированный класс панели) В Form1 создаю объект ZPanel,...

Ошибка при попытке использовать объект класса в определении другого класса
Муторное название получилось :scratch: Прошу помощи.... есть созданный класс работы со строкой: "MyString.h" class...

MFC, доступ к элементу класса (StatusBar) из другого класса
Здравствуйте. Я новичок и нигде не смог найти ответ на следующий видимо простой вопрос. Подскажите, пожалуйста. Проблема коротко: не...

5
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
10.02.2013, 22:52
Цитата Сообщение от SwanSONG Посмотреть сообщение
Попытка лобового вызова LongAdd(matrix[0][0],matrix[0][0]) заканчивается закономерной ошибкой error C3861: 'LongAdd': identifier not found.
такой функции нет. Есть функция LongMath::LongAdd
Цитата Сообщение от SwanSONG Посмотреть сообщение
строка LongMath::LongAdd(matrix[0][0],matrix[0][0]); дает error C2352: 'LongMath::LongAdd' : illegal call of non-static member function
функция не является статической, поэтому нужен объект класса, чтобы вызвать эту функцию.
Цитата Сообщение от SwanSONG Посмотреть сообщение
LongMath->LongAdd(matrix[0][0],matrix[0][0]); дает error C2143: syntax error : missing ';' before '->'
вообще не понял что тут хотели сделать.

Цитата Сообщение от SwanSONG Посмотреть сообщение
LongMath *matrix[8][8];
указатели на объекты? Надеюсь, что память под них выделена.

как-то так:
C++
1
(matrix[0][0])->LongAdd(matrix[0][0],matrix[0][0]);
но получается бредово. Может лучше перегрузить операторы?
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
10.02.2013, 23:01  [ТС]
Память естественно выделена.
Я хочу для двух объектов класса LongMath вызвать функцию, которая их бы сложила, но не знаю, как это сделать...
Вариант с описанием функций в теле основной программы мне не нравится.
Как перегрузить операторы и что это даст?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
10.02.2013, 23:18
Цитата Сообщение от SwanSONG Посмотреть сообщение
Как перегрузить операторы и что это даст?
Для примера:
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
#include <iostream> 
 
class myint{
    int x;
public:
    myint():x(0){}
    myint(int _x):x(_x){}
    myint(myint & val){this->x=val.x;}
    myint & operator=(myint & _x){
        this->x=_x.x;
        return *this;
    }
    myint & operator=(int _x){
        this->x=_x;
        return *this;
    }
    myint operator+(myint & _x){
        return myint(this->x+_x.x);
    }
    int GetX(){
        return this->x;
    }
    //...
    friend std::ostream & operator<<(std::ostream&,myint&);
    friend std::istream & operator>>(std::istream&,myint&);
};
 
std::ostream & operator<<(std::ostream & stream,myint & val){
    stream<<val.GetX();
    return stream;
}
std::istream & operator>>(std::istream & stream,myint & val){
    stream>>val.x;
    return stream;
}
 
int main(){
    myint a,b(12),c;
   std::cout<<"a = "<<a<<std::endl;
    std::cout<<"b = "<<b<<std::endl;
    std::cout<<"c = "<<c<<std::endl;
 
    std::cout<<"Enter a -> ";
    std::cin>>a;
    c=a+b;
    b=15;
    std::cout<<"a = "<<a<<std::endl;
    std::cout<<"b = "<<b<<std::endl;
    std::cout<<"c = "<<c<<std::endl;
}
0
Модератор
Эксперт по электронике
8979 / 6745 / 921
Регистрация: 14.02.2011
Сообщений: 23,857
10.02.2013, 23:21
Цитата Сообщение от SwanSONG Посмотреть сообщение
Я хочу для двух объектов класса LongMath вызвать функцию, которая их бы сложила, но не знаю, как это сделать...
переопределить в классе оператор сложения(вычитания, умножения .....)
тогда будет примерно так
C++
1
2
3
LongMath a;
LongMath b;
LongMath c=a+b;
0
2 / 2 / 0
Регистрация: 30.01.2013
Сообщений: 39
11.02.2013, 00:57  [ТС]
Спасибо за идею, буду завтра грызть, о таком я, если честно, даже не знал
Если вдруг пойму, что не тяну, то вполне сойдет и
matrix[0][0])->LongAdd(matrix[0][0],matrix[0][0],
предложенный уважаемым Croessmah, потому как мне это и надо.
Если так совсем айс?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.02.2013, 00:57
Помогаю со студенческими работами здесь

Вызов класса
есть созданный класс class TRect:public TObject { private: int a,b; public: __fastcall TRect (int a1,int b1) {a=a1;...

Вызов деструкторов членов класса
у меня есть класс поля которого тоже классы...при выходе из конструктора вызывается деструктор для его полей..даже для указателей...что...

Доступ к listbox из другого класса
Пишу MFC приложение. На форме есть listbox. Он имеет переменную lstLog. Вопрос: как писать в этот listox из другого класса?? Я...

Обращение к переменной из другого класса
Как обратиться к переменной из другого класса?

Помогите вызвать метод из другого класса?
есть три класса: CServer CMainWnd CMyApp как мне увидеть результат работы сервера(CServer) в классе CMainWnd, где имеется...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru