如何在C ++中创建类的实例

我是C ++初学者。我有一个班级,当我尝试编译它时说它缺少'主'。

如何创建此类的实例并访问其方法,我需要做什么?

#include 
#include 

using namespace std;

class Account
{
      string name;
      double balance;

  public:
      Account(string n);
      Account(string n, double initial_balance);

      string get_name() const;
      double get_balance() const;

      void deposit(double amount);

      void widthdraw(double amount);

};

修改</强>

我在哪里放主法?

我已经尝试将它放在一个不同的文件中,如下所示

    #include 
    int main(){
    Account:: Account(string n) : name(n), balance(0){}
    return 0 ;
    }

但这会给出一个错误,说目录中没有Account。我猜这是因为它没有编译

修改</强>

两个文件都在同一目录中

account_main.cc </强>

    #include
    #include 
    #include "Account.cc"

    Account:: Account(string n) : name(n), balance(0){} 
    int main()
    {
        Account account("Account Name");//A variable called "account"
        account.deposit(100.00);//Calls the deposit() function on account

        return 0 ;
    }

Account.cc </强>

#include
#include 

using namespace std;

class Account
{
      string name;
      double balance;

  public:
      Account(string n);
      Account(string n, double initial_balance);

      string get_name() const;
      double get_balance() const;

      void deposit(double amount);

      void widthdraw(double amount);

};
0
你在main的定义中定义了类构造函数吗?实际上,即使是家庭作业,也要获得一本好的C ++书籍并学习基本的基础知识。
额外 作者 Christian Rau,
如果这是家庭作业,那么你有没有一本书正在读书?我非常肯定它必须涵盖这个基本的东西。
额外 作者 ildjarn,
关于 main 的页面在C ++中。
额外 作者 wkl,
你在学什么?我认为您需要这里列出的一本或多本书: stackoverflow.com/q/388242/10077
额外 作者 Fred Larson,

3 答案

所有C ++程序都需要所谓的入口点main()函数始终是标准C ++程序的入口点。你需要提供一个 main(),否则链接器会抱怨。您可以通过以下两种方式之一编写 main()函数:

int main()
{
    return 0;
}

或者,如果您期望命令行参数:

int main(int argc, char ** argv)
{
    return 0;
}

请注意 void main() 在C ++中无效。另请注意, return 语句对于 main()函数并不是绝对必要的,但为了保持一致性,您还是应该明确地写一个。

C ++标准版3.6.1主要功能[basic.start.main]

     

5. main中的return语句具有离开main函数的效果(销毁具有自动存储持续时间的任何对象)和   以返回值作为参数调用exit。如果控制到达   main的结尾没有遇到return语句,效果是   执行

 返回0;
</代码> 

要回答有关您最新编辑的问题:

#include 

int main(){ 
    Account:: Account(string n) : name(n), balance(0){} 
    return 0 ; 
} 

main()的形式是正确的,但这不是您提供类成员定义的方式。构造函数需要在main函数之外。

#include 

// Outside of main()
Account::Account(string n) : name(n), balance(0)
{
} 

int main()
{ 
     return 0 ; 
} 

要创建 Account 的实例,请声明一个变量并传递所有必需的构造函数参数,如下所示:

int main()
{
    Account account("Account Name");//A variable called "account"
    account.deposit(100.00);//Calls the deposit() function on account
                            //Make sure you provide a function
                            //definition for Account::deposit().
    return 0;
}

Also, check the exact file path of where class Account is. If the Account class is in a file called Account.h and is in the same folder as the file containing the main() function, then you need to use #include "Account.h" instead of #include in that file. For example:

#include "Account.h"//Note .h and quotes

Account::Account(string n) : name(n), balance(0)
{
} 

int main()
{
   //...
    return 0;
}

这实际上是C ++编程语言的一个相当基本的方面。你肯定有一本书涵盖了这个吗?事实上, main()函数和 #include 语句通常是您在使用C ++编程时学到的第一件事。我强烈建议您选择一本优秀的C ++书籍并通读他们并做练习。

6
额外
感谢那。我已添加到原帖请看看。
额外 作者 code511788465541441,
我在main_account.cc中有main方法,它与account.cc位于同一个文件夹中。当我尝试编译main_account.cc时,它说帐户无法在目录中找到。我已经尝试了#include 和#include 但它不起作用。此目录中没有Account的可执行文件,我无法创建它,因为当我尝试编译Account时,它说没有主要方法
额外 作者 code511788465541441,
我已将这两个文件的内容添加到原始邮件中,如果可以,请查看并发布固定版本。谢谢
额外 作者 code511788465541441,
好吧,我做了那个,当我编译main_account.cc时,它说“main_account.cc :(。text + 0x92):未定义引用`Account :: deposit(double)'”
额外 作者 code511788465541441,
得到它的工作非常感谢你非常感谢
额外 作者 code511788465541441,
@ user521180:将 Account.cc 重命名为 Account.h 并在 Account_main.cc中执行 #include“Account.h” /代码>。
额外 作者 In silico,
@ user521180:类帐户中的文件是什么?它被称为 Account.h ?因为您还需要在include语句中指定文件扩展名。此外,编译文件时,将文件路径传递给源文件,而不是头文件,即 main_account.cc ,而不是 Account
额外 作者 In silico,
@Tyler Ferraro:是的。看我最新的编辑。
额外 作者 In silico,
这有效吗?它没有返回任何东西......
额外 作者 Genzume,

For your latest edit: not Account in the directory

试试这个:

#include "Account.h"  //quotes, and .h


Account:: Account(string n)  //this must be outside of main, it's its own function
: name(n), balance(0) //I put these on three seperate lines but
{}                    //that's a personal choice

int main(){  //this is what the code should do when it starts
    Account person1("George"); //create a Account called person1 with the name George
    cout << person1.get_name(); //c-output person1's name.
    return 0 ; //return success (success=0)
}
1
额外
#include“Account.cc”工作。使用main方法的类正在编译但是Account.cc还没有编译,那是正常的吗?
额外 作者 code511788465541441,
找人(亲自)教你使用你的编译器。你缺少很多步骤和概念。
额外 作者 Mooing Duck,
当您 #include 一个文件时,它基本上将该文件复制粘贴到当前文件中,因此该文件中的内容确实正在编译。为什么你说它不编译?
额外 作者 Mooing Duck,
#include 基本上将指定文件的内容粘贴到include伪指令的位置。因此,使用 #include“Account.cc”,Account.cc的内容将被编译为main_account.cc的一部分。一般来说,包含像这样的.cc文件被认为是不好的做法。相反,你应该使用'.h'头文件,并弄清楚如何分析标题中的内容与.cc文件中的内容。在您的情况下,您只需要使用命名空间std; 取出 #include,添加 std :: 的正确实例,然后将Account.cc重命名为Account.h。
额外 作者 bames53,

正如已经指出的,你需要一本像样的书。要回答您的问题,您应该知道以下内容: 类通常在.h文件中定义,并在.cpp或.cc文件中实现。您应该有三个文件:Account.h,Account.cc和main.cc.您只编译.cc文件,.h文件包含在您需要了解该类的代码部分中(例如,当您实际使用该类时)。如果您正在使用g ++(我认为是linux,unix或mingw),您可以使用以下命令编译该程序:g ++ main.cc Account.cc -o program_name

main.cc:

#include 
using namespace std;

#include "Account.h"
int main() {
  Account a("first account");

  cout << a.get_balance() << endl;
  a.deposit(100.0);
  cout << a.get_balance() << endl;

  return 0;
}

您的Account.h文件应如下所示:

#include
//#include  -- not needed here

// using namespace std; -- don't use 'using' in header files

class Account
{
  std::string name;
  double balance;

public:
    Account(std::string n);
    Account(std::string n, double initial_balance);

    std::string get_name() const;
    double get_balance() const;

    void deposit(double amount);

    void widthdraw(double amount);

};

最后,您的Account.cc文件应该实现该类。

#include "Account.h"

using namespace std;

Account::Account(string n) : name(n), balance(0.0) {}

Account::Account(string n, double initial_balance) :
name(n), balance(initial_balance) {}

string Account::get_name() const {
  return name;
}

double Account::get_balance() const {
  return balance;
}

void Account::deposit(double amount) {
  balance += amount;
}

void Account::widthdraw(double amount) {
  balance -= amount;//generously allow overdraft...
}

希望有所帮助。

罗马

1
额外