Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача функции указателя на объект класса, Передача функции указателя на объект кла 
V
    Опции темы
yurk84
Дата 1.5.2010, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.2.2009
Где: Москва

Репутация: нет
Всего: нет



Здравствуйте! Как объявить прототип функции, которой передаётся указатель на объект класса(см. программу). И что ещё необходимо сделать в программе? Я сделал так: объявил указатель на объект, а потом присвоил ему адресу этого объекта(см. программу). Заранее спасибо.

Код

// class_file.cpp : Defines the entry point for the console application.

//#include "stdafx.h"

#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//using namespace std;

double Price_of_travel (double, double, Auto *p_Citroen); // как объявить указатель на объект

class Auto
{
public:
  // Privetstvie, vyvod harakteristic i zadach programmy
  void   StartTravel();
  // Ustanovka distancii ot Peterburga do Moskvy
  void   SetDistance (int distance);
  // Vyvod distancii ot Peterburga do Moskvy
  int GetDistance(int distance) const;
  // Ustanovka ceny benzina za 1 litr
  void   SetPrice (double price);

// Constructor
Auto (char *name, double max_s, double max_b, double time_r, double rashod_t);

 // Destructor
~Auto () {}

private:
  char   *NameModel;      // name of Model "Citroen C3"
  double max_speed;       // max skorost' Modeli
  double max_bak;         // max obyem benzobaka
  double time_razgon;     // vremya razgona do 100km/ch
  double rashod_topliva;  // rashod topliva na 100km
};

Auto::Auto (char *name, double max_s, double max_b, double time_r, double rashod_t)
{
  *NameModel = *name;
  NameModel = new char[15];
  name = new char[15];
  max_speed = max_s;
  max_bak = max_b;
  time_razgon = time_r;
  rashod_topliva = rashod_t;
}


Auto Citroen("Citroen C3", 165.78, 58.50, 8.65, 6.56);

//--------------------------- Metody Classa-----------------------------------
void Auto::StartTravel()
{
  printf("Privet! Skoro ty otpravishsya v puteshestvie iz Peterburga v Moskvu");
  printf("\nA potomu, neobhodimo rasschitat' kolichestvo benzina i deneg dlya ego pokupki");
  printf("\n\nA poka, oznokomsya s harakterisitikami svoego avtomobilya");

  printf("\n\n\nModel avtomobilya: %s", Citroen.NameModel);
  printf("\n\nMaximalnaya skorost avtomobilya: %5.2f", Citroen.max_speed);
  printf("\n\nMaximalnyy obyem benzobaka: %4.2f", Citroen.max_bak);
  printf("\n\nVremya razgona do 100km/ch: %3.2f", Citroen.time_razgon);
  printf("\n\nRashod topliva na 100km puti: %3.2f", Citroen.rashod_topliva);
}

void Auto::SetDistance (int distance)
{
  int itsDistance = distance;
  printf("\n\n\nRassotyanie ot Peterburga do Moskvy: %d", itsDistance);
}

void Auto::SetPrice (double price)
{
  double itsPrice = price;
  printf("\n\nCena odnogo litra benzina: %4.2f", itsPrice);
}


int main()
{
  clrscr();
  double cena;

  double distance = 685.00;
  double price = 22.40;

  Auto *p_Citroen;             // объявляю указатель на объект
  p_Citroen = &Citroen;     // присваиваю адрес объекта

  Citroen.StartTravel();

  Citroen.SetDistance(distance);  // Ustanovka rasstoyaniya ot Peterburga do Moskvy
  Citroen.SetPrice(price);        // Ustanovka ceny benzina

  cena = Price_of_travel(distance, price, p_Citroen);  // что здесь написать для передачи указателя на объект

  getch();

  return 0;

}

double Price_of_travel(double distance, double price, Auto *p_Citroen)  // что здесь написать для передачи указателя на объект

{
  double v_benzina = (distance / 100);
  double stoimost = (v_benzina * price);
  return stoimost;
}



Это сообщение отредактировал(а) yurk84 - 1.5.2010, 22:22
PM MAIL Skype   Вверх
toxx
Дата 1.5.2010, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



а почему сразу не написал вот так? в main():
Код

Auto Citroen("Citroen C3", 165.78, 58.50, 8.65, 6.56);

вместо
Код

Auto *p_Citroen;             // объявляю указатель на объект
p_Citroen = &Citroen;     // присваиваю адрес объекта


Добавлено @ 22:41
Код

double Price_of_travel(double distance, double price, Auto *p_Citroen)  // что здесь написать для передачи указателя на объект


Код

double Price_of_travel(double distance, double price, const Auto &p_Citroen) 


Только зачем тебе тут объект если ничего не берёшь из него?

Это сообщение отредактировал(а) toxx - 1.5.2010, 22:43
PM MAIL   Вверх
yurk84
Дата 1.5.2010, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.2.2009
Где: Москва

Репутация: нет
Всего: нет



Спасибо за ответ.

1) А зачем инициализацию конструктора ставить в main?

2) Я так и не понял, как объявить функцию с указателем на объект?

3) Не беру из объекта - я просто ещё не вписал код в функцию.

Жду Вашего ответа! Заранее спасибо!
PM MAIL Skype   Вверх
toxx
Дата 1.5.2010, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата

1) А зачем инициализацию конструктора ставить в main?

Так ты не конструктор инициализируешь а объект Auto
Цитата

2) Я так и не понял, как объявить функцию с указателем на объект?

Код

Auto *p_Citroen;

если передавать в функцию то используй как я написал.
Код

double Price_of_travel(double distance, double price, const Auto &p_Citroen) 

PM MAIL   Вверх
yurk84
Дата 2.5.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.2.2009
Где: Москва

Репутация: нет
Всего: нет



То есть получается я всё верно объявил в функции? А почему у Вас в объявлении const Auto и только в одном месте?
Уважаемый toxx! Сделал всё как Вы написали, но компилятор пишет, что в строке 13 не хватает ")", а функции cena (в строке 98) нужен прототип. В чём может быть проблема. Заранее благодарю!

Это сообщение отредактировал(а) yurk84 - 2.5.2010, 00:15
PM MAIL Skype   Вверх
toxx
Дата 2.5.2010, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата

То есть получается я всё верно объявил в функции?

Объявил верно, но передал не верно 
Код

cena = Price_of_travel(distance, price, &p_Citroen);


+ у вас построение программы странновато выглядит, особенно
Код

void Auto::StartTravel()
{
  printf("Privet! Skoro ty otpravishsya v puteshestvie iz Peterburga v Moskvu");
  printf("\nA potomu, neobhodimo rasschitat' kolichestvo benzina i deneg dlya ego pokupki");
  printf("\n\nA poka, oznokomsya s harakterisitikami svoego avtomobilya");
  printf("\n\n\nModel avtomobilya: %s", Citroen.NameModel);
  printf("\n\nMaximalnaya skorost avtomobilya: %5.2f", Citroen.max_speed);
  printf("\n\nMaximalnyy obyem benzobaka: %4.2f", Citroen.max_bak);
  printf("\n\nVremya razgona do 100km/ch: %3.2f", Citroen.time_razgon);
  printf("\n\nRashod topliva na 100km puti: %3.2f", Citroen.rashod_topliva);
}


Добавлено @ 00:24
Цитата

что в строке 13 не хватает ")", а функции cena (в строке 98) нужен прототип.

перенесите 
Код

double Price_of_travel (double, double, Auto *p_Citroen); // как объявить указатель на объект

ближе к main() т.к. еще не объявлен класс Auto в 13й строке=)
функцию либо выше мэйна перенесите, или объявите прототип её
Код

double Price_of_travel(double distance, double price, Auto *p_Citroen);

Код

double Price_of_travel(double distance, double price, Auto *p_Citroen)  // что здесь написать для передачи указателя на объект
{
  double v_benzina = (distance / 100);
  double stoimost = (v_benzina * price);
  return stoimost;
}


Это сообщение отредактировал(а) toxx - 2.5.2010, 00:27
PM MAIL   Вверх
yurk84
Дата 2.5.2010, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.2.2009
Где: Москва

Репутация: нет
Всего: нет



Сейчас прога выглядит следующим образом. Не знаю правильно ли я всё сделал. У компилятора осталось только одно замечание:

Linking CLASS_~1.EXE:
Linker Warning: No module definition file specified: using defaults
Linker Error: Undefined symbol price_of_travel(double,double,auto near*) in module WORKS\CLASS_~1.CPP

Чем он ещё не доволен?


Код

// class_file.cpp : Defines the entry point for the console application.

//#include "stdafx.h"

#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//using namespace std;

class Auto
{
public:
  // Privetstvie, vyvod harakteristic i zadach programmy
  void   StartTravel();
  // Ustanovka distancii ot Peterburga do Moskvy
  void   SetDistance (int distance);
  // Vyvod distancii ot Peterburga do Moskvy
  int GetDistance(int distance) const;
  // Ustanovka ceny benzina za 1 litr
  void   SetPrice (double price);

// Constructor
Auto (char *name, double max_s, double max_b, double time_r, double rashod_t);
 // Destructor
~Auto () {}

private:
  char   *NameModel;      // name of Model "Citroen C3"
  double max_speed;       // max skorost' Modeli
  double max_bak;         // max obyem benzobaka
  double time_razgon;     // vremya razgona do 100km/ch
  double rashod_topliva;  // rashod topliva na 100km

};

Auto::Auto (char *name, double max_s, double max_b, double time_r, double rashod_t)
{
  *NameModel = *name;
  NameModel = new char[15];
  name = new char[15];
  max_speed = max_s;
  max_bak = max_b;
  time_razgon = time_r;
  rashod_topliva = rashod_t;
}

Auto Citroen("Citroen C3", 165.78, 58.50, 8.65, 6.56);

//--------------------------- Metody Classa-----------------------------------

void Auto::StartTravel()

{

  printf("Privet! Skoro ty otpravishsya v puteshestvie iz Peterburga v Moskvu");
  printf("\nA potomu, neobhodimo rasschitat' kolichestvo benzina i deneg dlya ego pokupki");
  printf("\n\nA poka, oznokomsya s harakterisitikami svoego avtomobilya");

//  printf("\n\n\nModel avtomobilya: %s", Citroen.NameModel);
  printf("\n\nMaximalnaya skorost avtomobilya: %5.2f", Citroen.max_speed);
  printf("\n\nMaximalnyy obyem benzobaka: %4.2f", Citroen.max_bak);
  printf("\n\nVremya razgona do 100km/ch: %3.2f", Citroen.time_razgon);
  printf("\n\nRashod topliva na 100km puti: %3.2f", Citroen.rashod_topliva);

}

void Auto::SetDistance (int distance)
{
  int itsDistance = distance;
  printf("\n\n\nRassotyanie ot Peterburga do Moskvy: %d", itsDistance);
}

void Auto::SetPrice (double price)
{
  double itsPrice = price;
  printf("\n\nCena odnogo litra benzina: %4.2f", itsPrice);
}

double Price_of_travel (double distance, double price, Auto *p_Citroen);


int main()
{
  clrscr();
  double cena;

  double distance = 685.00;
  double price = 22.40;

  Auto *p_Citroen;

  p_Citroen = &Citroen;

  Citroen.StartTravel();

  Citroen.SetDistance(distance);  // Ustanovka rasstoyaniya ot Peterburga do Moskvy
  Citroen.SetPrice(price);        // Ustanovka ceny benzina

  cena = Price_of_travel(distance, price, p_Citroen);

  getch();

  return 0;

}


double Price_of_travel(double distance, double price, const Auto *p_Citroen)
{
  double v_benzina = (distance / 100);
  double stoimost = (v_benzina * price);
  return stoimost;
}


PM MAIL Skype   Вверх
toxx
Дата 2.5.2010, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



У вас объявления не совпадают, но это всё неверно щас у вас будет гора ошибок...и аварийное завершение программы
Код

double Price_of_travel (double distance, double price, Auto *p_Citroen);

Код

double Price_of_travel(double distance, double price, const Auto *p_Citroen)
{
  double v_benzina = (distance / 100);
  double stoimost = (v_benzina * price);
  return stoimost;
}


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

Это сообщение отредактировал(а) toxx - 2.5.2010, 00:48
PM MAIL   Вверх
mes
Дата 2.5.2010, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yurk84 @  1.5.2010,  21:18 Найти цитируемый пост)
  *NameModel = *name;
  NameModel = new char[15];
  name = new char[15];

посмотрите внимательно, этот участок кода.. не помешает почитать о работе со си-строками.. 
а пока для вас же проще использовать std::string



--------------------
PM MAIL WWW   Вверх
toxx
Дата 2.5.2010, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



mes
Цитата

посмотрите внимательно, этот участок кода.. не помешает почитать о работе со си-строками.. 

блин...ну чтоже вы... я хотел к этому перейти в следующем посте =)
но у меня еще есть пара тройка замечаний по коду=)

Это сообщение отредактировал(а) toxx - 2.5.2010, 01:10
PM MAIL   Вверх
djamshud
Дата 2.5.2010, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Не хочу отвлекать вас от творческих мучений, но все таки замечу, что переносить весь класс перед функцией не нужно. Достаточно перед функцией объявить:
Код

class Auto;


Ну и в проектировании задачи вы явно накосячили:

Код

void Auto::StartTravel(){
...
printf("\n\n\nModel avtomobilya: %s", Citroen.NameModel);
...
}


Ситроен нужно убрать и поставить this->NameModel, такмм образом сможете распечатать название любой марки (это касается и нескольких следующих строк).

Это сообщение отредактировал(а) djamshud - 2.5.2010, 01:14


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
toxx
Дата 2.5.2010, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



djamshud
чувствуется творческие мучения тут продолжаться будут еще долго и я пожалуй спать пойду =)
т.к. править тут еще нужно много например еще это 
Код

void Auto::SetDistance (double distance)
{
  double itsDistance = distance;
  printf("\n\n\nRassotyanie ot Peterburga do Moskvy: %d", itsDistance);
}
void Auto::SetPrice (double price)
{
  double itsPrice = price;
  printf("\n\nCena odnogo litra benzina: %4.2f", itsPrice);
}



PM MAIL   Вверх
yurk84
Дата 2.5.2010, 01:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.2.2009
Где: Москва

Репутация: нет
Всего: нет



Спасибо всем за ответы. С главной проблемой я уже справился. А за this-> NameModel отдельное спасибо!


//чувствуется творческие мучения тут продолжаться будут еще долго и я пожалуй спать пойду =)
т.к. править тут еще нужно много например еще это //

Да нет здесь никаких мучений: просто const в объявлении функции надо было убрать и все дела!

Это сообщение отредактировал(а) yurk84 - 2.5.2010, 01:25
PM MAIL Skype   Вверх
toxx
Дата 2.5.2010, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



yurk84
удачи в исправлении ошибок =)
PM MAIL   Вверх
mes
Дата 2.5.2010, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(yurk84 @  2.5.2010,  00:22 Найти цитируемый пост)
Да нет здесь никаких мучений: 

не хочется омрачать Вам настроение перед сном.. пусть будет так как Вы считаете smile


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0626 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.