呼叫的实例

Calling Instance of a Class

本文关键字:实例 呼叫      更新时间:2023-10-16

我想知道是否有人可以给我一些有关如何调用课程并执行函数的指导。

基本上,我有一个虚拟银行计划,我想为用户添加和存入钱。

我创建了一个名为银行银行的银行实例;

所以我喜欢这个呼吁访问该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);