Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 12:43   #1
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
Плохо Использование методов вне класса

Здравсвуйте программисты! Хочу вывести на экран 3 числа(8,9,10) , но почему-то не выводится. не скажите в чём может быть проблемма. Вот мой код:

Код:

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#pragma argsused

class kl{
public:
int z,f,k,s;
kl():z(0),f(0),k(0) {}
kl(int s, int d, int r):z(s),f(d),k(r) {}
void molodes(kl,kl,kl);
};

void kl::molodes(kl s1, kl s2, kl s3)
{

cout<<z<<endl;
cout<<f<<endl;
cout<<s1.z + s2.f + s3.k;
}


main()
{

 kl d;
 kl x(8,9,10);
 d.molodes();

 Sleep(10000);
 }
prikolist вне форума
Старый 06.05.2009, 13:07   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Так у вас же метод принимает 3 параметра:
Код:
void kl::molodes(kl s1, kl s2, kl s3)
а вы его вызываете так:
Код:
 d.molodes();
С чего бы ему что-то считать? )

Как-то так должно быть:
Код:
 kl x(8,9,10);
 kl y(1,2,3);
 kl z(0,5,3);
 d.molodes(x,y,z);
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 06.05.2009, 13:12   #3
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Если написать так как вы написали, выведется на экран 0 0 13, а не 8,9,10.
prikolist вне форума
Старый 06.05.2009, 13:21   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Если написать так как вы написали, выведется на экран 0 0 13, а не 8,9,10.
Конечно! А вы посмотрите на то, что делает метод:
Код:
cout<<z<<endl;
cout<<f<<endl;
cout<<s1.z + s2.f + s3.k;
Первые два выводимых числа - z и f экземпляра d.
Но они равны нулю.

Если вам нужно вывести 3 числа, то объявляйте метод так:
Код:
void kl::molodes(int s1, int s2, int s3)
Код:
void kl::molodes(int s1, int s2, int s3)
{
cout<<s1<<" "<<s2<<" "<<s3<<endl;
}
Тогда при вызове
Код:
 kl d;
 d.molodes(8,9,10);
Он выведет все как надо.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]

Последний раз редактировалось Sazary; 06.05.2009 в 13:23.
Sazary вне форума
Старый 06.05.2009, 13:27   #5
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Я хочу,чтоб в функции main(), изменить значение z,f,k, для этого я писал
вот эти 2 строки:
Код:
kl():z(0),f(0),k(0) {}
kl(int s, int d, int r):z(s),f(d),k(r) {}
Чтоб в конце не писать несколько строк,а создать объект, а потом изменить нулевые значени через него.

Последний раз редактировалось prikolist; 06.05.2009 в 13:30.
prikolist вне форума
Старый 06.05.2009, 13:34   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Вы создаете объект.
Код:
 kl d;
Значения его переменных инициализируются нулями.
Затем вы создаете новый объект.
Код:
kl x(8,9,10);
Если вы хотите создать объект и вывести его переменные, то это как-то так:
Код:
class kl{
public:
 int z,f,k,s;
kl():z(0),f(0),k(0) {}
kl(int s, int d, int r):z(s),f(d),k(r) {}
void molodes(void);
};

void kl::molodes(void)
{
cout<<z<<" "<<f<<" "<<k<<endl;
}
Вызов:
Код:
 kl d(8,9,10);
 d.molodes();
--------------
Если, как вы сказали, вы хотите изменить значения позже, то можно добавить метод:
Код:
void kl::met(int a,int b, int c)
{
 z = a;
 f = b;
 k = c;
}
И вызывать так:
Код:
kl d;
 d.met(8,9,10);
 d.molodes();
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 06.05.2009, 14:42   #7
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Спасибо за ответ. Последний вариант лучший,только там используется void void kl::molodes(void) Наверное потому,что одни cout используются в методе.

Последний раз редактировалось prikolist; 06.05.2009 в 14:54.
prikolist вне форума
Старый 06.05.2009, 17:59   #8
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Скажите,а почему в этом коде выводит 1, а не 7000.
Вот код:

Код:
#include <vcl.h>
#pragma hdrstop
#include <iostream.h>
#pragma argsused

class s{
public:
int a,b,c,d;
s():a(0),b(0),c(0) {}
s(int x1, int x2, int x3):a(x1),b(x2),c(x3) {}

void tir(s);
void sem(void);
};



void s::tir(s w)
{
w.d = 7000;
}

void s::sem(void)
{
cout<<d<<endl;
}

main()
{
s dist1,dist3;
dist1.sem();
Sleep(10000);
}
prikolist вне форума
Старый 06.05.2009, 18:21   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Проследите, что у вас происходит:
Код:
s dist1,dist3;
dist1.sem();
Вы создаете экземпляр dist1.
a,b,c инициализируются нулями:
Код:
s():a(0),b(0),c(0) {}
Потом вы вызываете метод sem, который выводит d:
Код:
cout<<d<<endl;
но где это d инициализировано? Нигде.

Видимо, надо так:
Код:
s dist1,dist3;
dist3.tir(dist1);
dist1.sem();
Дальше. Сам метод реализован неверно. Он получает копию объекта, а нужна ссылка:
Код:
void tir(s &);
Код:
void s::tir(s &w)
{
w.d = 7000;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума
Старый 06.05.2009, 19:09   #10
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Спасибо, теперь ясно. Ещё,скажите, прототипы,которые объявляют для цели,чтоб можно было использовать метод, находящийся вне функции, и использовать в нём переменные из класса, обязательно должны иметь возвращаемое значение void? Тоесть:
void tir();
void sem();
prikolist вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
наследование методов TaTT DoGG Общие вопросы .NET 4 27.02.2009 01:27
как работать вне формы? Elm0 Общие вопросы Delphi 3 04.12.2008 14:01
лежит ли заданная точка А внутри или вне много-угольника. Anton1997 Общие вопросы Delphi 4 30.11.2008 16:07
Создание класс с использованием методов доступа к данным El_Bint0 Помощь студентам 1 14.03.2007 10:16