呼叫的实例
Calling Instance of a Class
我想知道是否有人可以给我一些有关如何调用课程并执行函数的指导。
基本上,我有一个虚拟银行计划,我想为用户添加和存入钱。
我创建了一个名为银行银行的银行实例;
所以我喜欢这个呼吁访问该instancce的银行:
main.cpp:
#include <iostream>
using namespace std;
#include "bank.hpp"
int main(){
bank bankCustomer1;
cout << "Let's save some money to bank" << endl;
bank.bankCustomer1.addMoney(10);
return 0;
}
bank.hpp
#ifndef BANK_HPP
#define BANK_HPP
#include "bank.hpp"
#include <string>
class bank {
private: savings = 0;
public:
bank();
void defaultsettings();
bool addMoney(double money);
void getSavings();
}
bank.cpp
#include "bank.hpp"
#include <iostream>
#include <iomanip>
bank.addMoney(double money){
bool moneyAdded = true;
if(money < 0){
cout << "There has been an error" << endl;
return false;
}
else{
savings = savings + money;
return true;
}
}
bank.getSavings(double money){
//Nothing has been added
}
这是错误的,我不知道为什么。我得到这些错误:
expected unqualified-id before ‘.’ token
bank.bankCustomer1.addMoney(10).
您对C 语法和语义的基本理解似乎还可以,有以下例外。
首先,在main.cpp中,您要这样做:
bank.bankCustomer1.addMoney(10);
尝试访问对象时,您不需要(也不允许)指定类名。您必须这样做:
bankCustomer1.addMoney(10);
这将在bankCustomer1
对象上调用addMoney()
函数。编译器已经知道此对象是bank
类。
接下来,在bank.hpp
中,您有:
class bank {
private: savings = 0;
您正在尝试声明私人成员变量。但是您需要指定变量的类型。在这种情况下,您似乎希望它是double
的类型,因此您需要这样做:
class bank {
private:
double savings = 0;
(请注意,您不需要在每个私人成员面前写private:
,因此通常将private:
放在自己的行上。)
也在bank.hpp
中,您的顶部有通常的多个包容罩:
#ifndef BANK_HPP
#define BANK_HPP
但是您忘了用#endif
关闭#ifndef
。在文件末尾,您需要:
#endif
但是,我敢肯定有人会在这里不同意,因为它不是标准的C ,我建议使用#pragma once
而不是经典的包容罩。因此,而不是:
#ifndef BANK_HPP
#define BANK_HPP
// ...
#endif
我建议您在标题开始时使用此信息:
#pragma once
是的,它不在标准中,但它是几乎每个编译器支持的事实标准。
请注意,bank.hpp
中的这一行:
#include "bank.hpp"
不需要,没有效果。您应该删除它。文件不应包括本身。如果不是用于多个包容罩,这将为您带来编译错误,因为您会遇到一个无限的包含循环。
接下来,在bank.cpp
中,您有:
bank.addMoney(double money) {
试图实现成员函数时,这是错误的语法。语法是:
return_type class_name::function_name(arguments)
所以您需要:
bool bank::addMoney(double money) {
最后,您已在bank.hpp
标题中声明了一个构造函数和函数,您实际上并未在任何地方实现:
bank();
void defaultsettings();
您也需要实施这些。您可以在bank.cpp
中执行此操作:
bank::bank()
{ /* ... */ }
void bank::defaultsettings()
{ /* ... */ }
函数可以在标题内而不是.cpp
文件内实现。示例:
class bank {
public:
bank()
{ /* ... */ }
// ...
};
这通常是针对非常短的功能完成的。
和最终注意:如果您不需要构造函数中的任何代码,则实际上可以完全省略它。编译器将为您提供任何无能为力的默认构造函数。因此,在这种情况下,您只能从标题文件中删除bank()
,而无需实现它。
不过建议:在C 中(大多数具有类似类模型的语言),该约定是大写的类名。因此,您应该使用Bank
代替bank
。这使得将类名与代码中的变量名称区分开变得更容易。
这是您可以找到很多教程的东西。
您需要首先指定每个函数的返回类型,其次,您需要指定功能的名称空间。
这样:
#include "bank.hpp"
#include <iostream>
#include <iomanip>
bool Bank::addMoney(double money){
bool moneyAdded = true;
if(money < 0){
cout << "There has been an error" << endl;
return false;
}
else{
savings = savings + money;
return true;
}
}
void Bank::getSavings(double money){
//Nothing has been added
}
getavings听起来好像应该返回双
当您从Main中调用成员函数时,您无需指定它是银行对象,"它已经知道它是一个,因为您在使用它之前创建了它。所以而不是
bank.bankCustomer1.addMoney(10);
您将其称为这样的函数:
bankCustomer1.addMoney(10);
- 从C++实例化QML
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 呼叫运营商<<临时
- 无法创建抽象类的实例
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 建议在运行时将带有类实例的列表从c++导入qml
- 约束和显式模板实例化
- 通过实例理解std::move及其目的
- 模板功能不使用RVALUE参考实例化/接收呼叫
- 隐藏方法的实例返回到呼叫者
- 呼叫的实例
- 单元测试呼叫实例变量的函数
- 您能否防止构造函数的呼叫,而无需实例化