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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.11.2010, 06:26   #1
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию Как добавит описание класса в *.h фаил?

Сегодня делил одну большую программу на три модуля.В первом были описаны функции,во втором классы,а третий состоял из объявления глобальных переменных и самой функции main.К сожалению,без описания класса в *.h файле программа не видит этих классов,а как описать не знаю.Мне нужно что-то на подобие прототипа функции.Пробовал такой вариант,так сказать из головы:
Код:
// stdafx.h: включаемый файл для стандартных системных включаемых файлов
// или включаемых файлов для конкретного проекта, которые часто используются, но
// не часто изменяются
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

// TODO. Установите здесь ссылки на дополнительные заголовки, требующиеся для программы
#include <iostream>
using namespace std;

// Моё WTF?!
class Checking;                     
class Savings;

// объявление прототипов
void process(Checking* pChecking);
void process(Savings* pSavings);
На что компилятор выдал следующие ошибки:
Цитата:
1>function.cpp(17) : error C2027: использование неопределенного типа "Checking"
1> stdafx.h(19): см. объявление 'Checking'
1>function.cpp(17) : error C2227: выражение слева от "->deposit" должно указывать на тип класса, структуры или объединения либо на универсальный тип
RFbager вне форума Ответить с цитированием
Старый 02.11.2010, 08:19   #2
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Ну обычно это делается так:

файл Foo.h

Код:
#pragma once

class Foo
{
public:
    Foo( );
     ~Foo( );
//другие методы и данные
};
файл Foo.cpp

Код:
#include "Foo.h"

Foo::Foo( )
{
}
Foo::~Foo( )
{
}
//дальше в том же духе
теперь если какой-то части программы(в другом файле) нужен класс Foo, то в начале пишется
Код:
#include "Foo.h"
coinkrsk вне форума Ответить с цитированием
Старый 02.11.2010, 15:52   #3
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию Не помогло или мои кривые руки?

Попробовал,не получилось.Вот код класса:
Код:
class Checking
{
  public:
    Checking(int initializeAN = 0)
    {
      accountNumber = initializeAN;
      balance = 0.0;
    }

    // функции обращения
    int accountNo()
    {
      return accountNumber;
    }
    double acntBalance()
    {
      return balance;
	}
    //функции транзакций
    void deposit(double amount)
    {
      balance += amount;
	}
    void withdrawal(double amount);

    // функция вывода объекта в cout
    void display()
    {
    cout << "Account " << accountNumber
         << " = " << balance
         << "\n";
	}
  protected:
    unsigned accountNumber;
    double balance;
};
void Checking::withdrawal(double amount)
{
  if (balance < amount)
  {
    cout << "There is not enough money: the balance is equal "
         << balance
         << ", the check sum is equal " << amount
         << "\n";
  }
  else
  {
    balance -= amount;
    // если баланс падает слишком низко...
    if (balance < 500.00)
    {
      // ...удержать деньги за обслуживание
      balance -= 0.20;
    }
  }
}
А здесь код моего заголовка:
Код:
#pragma once
class Checking
{
public:
    Checking();
	int accountNo();
	double acntBalance();
	void deposit(double amount);
	void withdrawal(double amount);
	void display();
protected:
    unsigned accountNumber;
    double balance;
};
Компилятор на это говорит следующее:
Цитата:
1>class.cpp(6) : error C2011: Checking: переопределение типа "class"
1> checking.h(3): см. объявление 'Checking'
RFbager вне форума Ответить с цитированием
Старый 02.11.2010, 16:16   #4
MaRKer.nsk
Пользователь
 
Регистрация: 27.03.2010
Сообщений: 53
По умолчанию

По моему ты просто пытаешься создать 2-а раза один класс
MaRKer.nsk вне форума Ответить с цитированием
Старый 02.11.2010, 16:28   #5
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию

Тогда как должно выглядеть описание моего класса в *.h файле?
RFbager вне форума Ответить с цитированием
Старый 02.11.2010, 17:40   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Cpp'шник должен быть такой:
Код:
    Checking::Checking(int initializeAN = 0)
    {
      accountNumber = initializeAN;
      balance = 0.0;
    }

    // функции обращения
    int Checking::accountNo()
    {
      return accountNumber;
    }
    double Checking::acntBalance()
    {
      return balance;
	}
    //функции транзакций
    void Checking::deposit(double amount)
    {
      balance += amount;
	}

    // функция вывода объекта в cout
    void Checking::display()
    {
    cout << "Account " << accountNumber
         << " = " << balance
         << "\n";
	}
void Checking::withdrawal(double amount)
{
  if (balance < amount)
  {
    cout << "There is not enough money: the balance is equal "
         << balance
         << ", the check sum is equal " << amount
         << "\n";
  }
  else
  {
    balance -= amount;
    // если баланс падает слишком низко...
    if (balance < 500.00)
    {
      // ...удержать деньги за обслуживание
      balance -= 0.20;
    }
  }
}
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 02.11.2010, 18:36   #7
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию

Тоесть при модульном подходе об inline функциях можно забыть?
RFbager вне форума Ответить с цитированием
Старый 02.11.2010, 20:32   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Зачем же забывать? А для чего тогда, по-вашему, служит ключевое слово inline?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 02.11.2010, 20:52   #9
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Inline-функции должны объявляться внутри класса, прямо в .h.
Если вынести их в .cpp, компилятор не сможет обработать их как inline
Black Fregat вне форума Ответить с цитированием
Старый 03.11.2010, 09:24   #10
RFbager
Пользователь
 
Регистрация: 30.10.2010
Сообщений: 14
По умолчанию

Большое спасибо всем за помощь,наконец-то вкурил принципы

Дабы не плодить сто тридцать пять тем,отпишусь еще об одной ошибке,которая выяснилась.Вот обрезанные части кода1)Функция (2)Код класса (3)Заголовок класса.
(1)
Код:
void process(Checking* pChecking)
{
  cout << "Введите положительное число для вклада,\n"
       << "отрицательное для снятия, 0 для завершения\n";
  double transaction;
  do
  {
    cout << " : ";
    cin >> transaction;

    // вклад
    if (transaction > 0)
    {
      pChecking->deposit(transaction);
    }
    // снятие
    if (transaction < 0)
    {
      pChecking->withdrawal(-transaction);
    }
  } while (transaction = 0);
}
(2)
Код:
Checking::Checking(int initializeAN = 0)
{
  accountNumber = initializeAN;
  balance = 0.0;
}
inline void Checking::deposit(double amount)
{
  balance += amount;
}
void Checking::withdrawal(double amount)
{
// код функции
}
(3)
Код:
class Checking
{
  public:
    Checking(int initializeAN);
    void deposit(double amount);
    void withdrawal(double amount);
  protected:
    unsigned accountNumber;
    double balance;
};
Собственно если обьявлять функцию Checking:eposit встраиваемой,то компилятор выдает две ошибки:
Цитата:
1>Function.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall Checking:eposit(double)" (?deposit@Checking@@QAEXN@Z) в функции "void __cdecl process(class Checking *)" (?process@@YAXPAVChecking@@@Z)
1>BUDGET2.exe : fatal error LNK1120: 1 неразрешенных внешних элементов
Стоит только сделать функцию класса не встраиваемой,все замечательно собирается.Обьясните почему так происходит?
RFbager вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
описание класса SvetaLee Помощь студентам 1 30.10.2010 23:27
описание класса для определения одномерных массивов строк фиксированной длины Helen09 Помощь студентам 0 23.03.2010 00:28
описание класса в паскале ai\ekcah^p Помощь студентам 0 14.03.2010 17:31
Описание класса. frem-dag Общие вопросы C/C++ 4 11.01.2010 19:53