Создание класса счета
class
очень похож на struct
в исполнении, но концептуально они несколько иначе:
В дни c
, вы можете иметь некоторые данные, которые принадлежат вместе (например, номер счета, баланс, контакт), и поэтому вы должны использовать struct
, чтобы сохранить все в одном комплекте. Вы можете думать об этом как (физическую) папку в шкафу для хранения документов - все это в одном месте, но это всего лишь совокупность данных, не более того. Это struct
.
Чтобы использовать эту папку с файлами, вам нужно получить папку, посмотреть, что в ней находится, и решить, что с ней делать. В этой папке нет реальной защиты данных. Это аналогично наличию множества функций, которые вы можете передать экземпляру struct
, и функция может изменять содержимое этой структуры. Так происходит в c
, но нет защиты данных, это может быть довольно утомительно, и было желание чего-то лучшего.
A class
имеет данные и методы. Внезапно, это не безжизненная папка с файлами. Теперь это настоящий миньон - он содержит данные, но вы также можете сказать, что он что-то делает для вас, и он знает, как использовать свои собственные данные для выполнения задачи. Таким образом, миньон может защитить данные от внешних помех и по-прежнему выполнять полезную работу.
Итак, как предлагает @Greg, определение класса было бы лучшим подходом здесь. Вы хотите, чтобы он содержал уникальные для каждой учетной записи данные и методы, которые будут обрабатывать данные (конструктор для его инициализации, другие - для изменения ПИН-кода и баланса и, вероятно, некоторые геттеры для просмотра данных - или, по крайней мере, что-то распечатайте его для отладки).
Делая это таким образом, нет необходимости в ссылках, но я немного поговорю о типах данных за один момент, потому что вы тоже смущены этим.
типы данных
Давайте посмотрим на ваш счет структуры:
struct account{
char accountNumber[10];
char pin[10];
double balance;
};
Что такое balance
? Это число с плавающей запятой. Это означает, что он содержит число, которое может иметь десятичную точку. Например, это может быть 5, 3.7, 3.1415926535898, -123, -2.34 и т. Д. Но это не может быть «собака», «кошка» или буква «q».
Что такое accountNumber
и pin
? Вы создали их как массивы символов (в частности, длиной 10 символов). Что это значит? Ну, они могут содержать блок символов, 9 символов или меньше (не забудьте оставить место для нулевого терминатора). Например, они могут содержать «1», «2.3», «1.2.3.4», «dog», «cat», «^ & * $^@ <> X".
Обратите внимание, что существует мир разницы между 1
и "1"
. 1
- это номер. Если бы мы заглянули внутрь компьютера на всех и на нули, он будет храниться в памяти как-то вроде 00000000 00000000 00000000 00000001
. Обычно мы записываем такое число в шестнадцатеричном виде, потому что оно короче, и это выглядит так: 0x00000001
. Это 32-битный (он же 4 байта). Это специфично для платформы, но это наиболее часто встречающееся и должно быть достаточно, чтобы контрастировать с текстовым «1»:
«1» - это два символа: «1» и «\ 0» (символ - - не номер - один, а нулевой ограничитель для завершения строки). Это будет в памяти примерно так: 00110001 00000000
- или int hex: 0x3100
. Обратите внимание, что это МНОГО короче (каждый символ - один байт), поэтому «1» - всего 2 байта, а фактическое целое число - 4 байта. и что 1-бит находится в другом месте. и что '1' на самом деле является шестнадцатеричным 0x31!
Важно понимать разницу между символьными строками и числами. В основном, строки символов предназначены для текста (или для печати номеров в формате для чтения человеком), тогда как числовые типы данных предназначены для фактической числовой работы.
Имея это в виду, вы можете пересмотреть свои типы данных здесь.
Заголовок против Источника, Декларация против определения
то, что C++
имеет, что Java
не хватает, это файлы заголовков. Они могут быть очень сложными и раздражающими порой, но также весьма полезны другими способами. Оставив это в стороне, я просто сосредоточусь на практических аспектах того, что происходит.
Объявления против Определения
Во-первых, что такое заявление? Это способ сообщить компилятору «У меня есть вещь». Это, вероятно, кажется чрезмерно основным, но контрастирует с определением:
A определение - это способ сообщить компилятору «Вот как выглядит эта вещь».
Итак, если вы хотите создать функцию, есть очень мало, что необходимо для объявления:
int AddTheseNumbers(int a, int b);
Это говорит компилятор достаточно о AddTheseNumbers
, что теперь мы можем написать код, который использует его. Компилятор знает:
- Название функции.
- Возвращаемое значение функции - поэтому он знает, сколько места в стеке выделяется для возврата.
- Параметры (два
int
s, переданные по значению) - поэтому он знает, сколько нужно нажать на стек перед вызовом функции.
Но обратите внимание, что компилятор не знает: что функция на самом деле делает. Это потому, что компилятор не должен это знать. Да, нам это нужно в конце концов (очевидно, что программа не может работать без нее), но не нужно создавать файл Foo.obj (компоновщик будет использовать его при создании Program.exe).
Теперь давайте посмотрим на определение этой функции:
int AddTheseNumbers(int a, int b) {
return a + b;
}
Это же подпись как декларация - это как компилятор/компоновщик знает, что мы определяем, и теперь мы имеют корпус функции. Определение .
Заголовки для декларациях, Source являются для Определения
Итак, мы могли бы создать Simple.h
с:
int AddTheseNumbers(int a, int b);
И Simple.cpp
с:
int AddTheseNumbers(int a, int b) {
return a + b;
}
Что мы могли бы составить для создания Simple.obj
.
Кроме того, мы можем создать MyProgram.cpp
с:
#include "Simple.h" // Hey look, I can now use my other file!
int main(int argc, char** argv) {
std::cout << "Adding 3 + 5: " << AddTheseNumbers(3, 5) << std::endl;
return 0;
}
И мы можем составить, что в MyProgram.obj
. Затем мы используем линкер , чтобы связать эти OBJ-файлы вместе, производя MyProgram.exe
, которые мы затем можем запустить.
Классы
Это становится немного более сложным, с классами. Если коротко, то для класса Foo
, мы можем сделать:
class Foo;
Это называется вперед декларация и просто сообщает компилятору «Там структура называется Foo, но я не знаю, что в нем».Это полезно для передачи экземпляров Foo
по ссылке или указателю, но вы ничего не можете сделать с Foo
, потому что вы не знаете, что в нем.
class Foo {
int x;
public:
int getX();
};
Это полное объявление Foo
. Компилятор знает, какие данные в нем (что необходимо для вычисления полного размера Foo
) и подписи метода (как и объявления функций выше). Этого достаточно, чтобы написать код, который делает:
Foo f;
std::cout << f.getX();
И это компилируется, поскольку компилятор знает, сколько памяти выделить для Foo
и как взаимодействовать с ним. Он не знает, что делает getX
, но ему все равно - это работа линкера.
int Foo::getX() {
return x;
}
Это определение из getX
метода Foo
«ы. Это одна и та же подпись (возвращает int, без параметров), и она находится в Foo
. Обратите внимание, что этот метод может просто использовать x
- сам метод имеет экземпляр Foo
, поэтому он может получить доступ ко всему в том же экземпляре Foo
.
Поскольку вы отметили этот 'C++', кажется, что логично, что вы хотите использовать * методы * на объекте 'account' для выполнения такого рода вещей. Таким образом, вы вызываете метод со ссылкой на существующую учетную запись. Это звучит разумно? –
Вы, кажется, новичок в C++. Вы новичок в программировании вообще, или вы исходите с другого языка? Это может помочь нам объяснить в терминах, с которыми вы более знакомы. – Tim
Я сделал немного java, но да, я начал C++ – user3188716