【问题标题】:C++ : Using an array in a nested class definition (OOP)C++:在嵌套类定义 (OOP) 中使用数组
【发布时间】:2011-06-28 01:08:12
【问题描述】:

所以我正在尝试定义一个类,并且我正在使用另一个不同类的数组来定义它。

  //header file for Name.h
class Name {
    string last;
    string first;
}; 

 //header file for Depositor.h
    class Depositor {
        Name name;
        string ssn;}; 



//header file for Account.h 
    class Account {
        Depositor depositor;
        int acctnum;
        string type;
        double balance;
    };

//header file for Bank.h
#include "Account.h"
class Bank {
    Account account[]; //is this possible?
    int active_accts;
};

当我编写 cpp 文件时,我遇到了很多问题!

//example of mutator
void Bank::setLastname(string lastname)
{
    account.setLastname (lastname);
}

我没有在头文件中包含我写入的修改器和访问器,但它们在那里并且是公开的——它不会编译。 你能帮我吗?在 Bank.h 中使用类的数组是否有效?

【问题讨论】:

    标签: c++ arrays oop class


    【解决方案1】:

    在 Bank.h 中使用类的数组是否有效?

    是的,但它必须有一个固定的尺寸,例如,

    Account account[3];
    

    在 C++ 中,类型始终具有固定大小,由于数组成员变量构成类大小的一部分,因此您需要指定数组中有多少元素。

    如果您不知道需要多少元素,可以使用序列容器:

    std::vector<Account> account;
    

    【讨论】:

    • 当然,成员数组的大小可以通过非类型模板参数来指定。这就是Boost.Array 的工作原理。
    • @In:当然,但它仍然成为类型的一部分; boost::array&lt;T, 3&gt; 下的数组的维度为 3:它是已知且固定的,boost::array&lt;T, 3&gt;boost::array&lt;T, 4&gt; 的类型不同。
    • 对。 OP 仍然需要在编译期间的某个时间提供数组的大小。
    【解决方案2】:

    accountAccounts 的数组,这意味着您需要执行account[0].setLastname(lastname); 之类的操作

    【讨论】:

      【解决方案3】:

      考虑使用向量而不是数组。

      #include <vector>
      
      // ...
      
      class Bank {
          std::vector<Account> accounts;
          int active_accts;
      };
      

      【讨论】:

      • 是的,尽管 active_accts 可能是在尝试管理大小,为您处理哪个向量,然后它会被丢弃。
      【解决方案4】:

      你不能在整个数组上调用setLastname(lastname)。您需要在数组内的 Account 类的特定实例上调用它,如下所示:account[0].setLastname(lastname);

      另一方面,您确实应该将 指针 数组存储到 Account 对象。

      【讨论】:

      • 如其他答案中所述,向量实际上是更好的解决方案。它允许一个可扩展的存储位置。你仍然需要指针。
      • 根据 Account 类的大小和数量,您可以很容易地填满堆栈。最好有一个指向 Account 对象的指针数组,这些指针分配在堆上而不是堆栈上。
      【解决方案5】:
      • Account 不是Bank 的嵌套类。 Bank 有一个Account 数组类型的成员数据实例。

      • 您可以在类中拥有原始数组成员,但您必须在类定义中指定数组的大小:Account account[42];。原因是当你#include另一个编译单元中的类定义,然后实例化该类的一个实例时,编译器需要知道该实例的大小。

      • 使用std::vector&lt;Account&gt; 而不是原始数组是一个明智的主意。 std::vector 不需要在施工时承诺特定的尺寸;它动态增长。为什么std::vector 在类定义中不需要大小,而原始数组却需要? std::vector 作为成员持有指向堆上元素的 指针。所以编译器确实知道std::vector 的大小;它使用指针的大小而不是元素的计数。

      【讨论】:

      • “我没有在头文件中包含我写入的 mutators 和 acessors,但它们在那里并且是公开的”引用 OP,这样就可以忽略你的第一点和第三点,就像他一样使用mutators,而不是直接访问变量。否则有效答案。
      【解决方案6】:

      通过在头文件中声明数组的值,并在.cpp文件中添加一个变量,你可以解决所有问题并将其保留为数组。

      //header file
      class Bank {
        Account account[100];
        int active_accts;
       public:
      //mutator
      void setLastname (string,int);
      };
      
      //the implementation file
      void Bank::setLastname (string last, int index)
      {
         account[index].setLastname(last);
      }
      

      这会解决你所有的问题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-18
        • 2020-12-30
        • 2021-11-08
        • 1970-01-01
        • 2011-12-17
        • 2010-11-21
        • 1970-01-01
        • 2014-01-17
        相关资源
        最近更新 更多