【问题标题】:How to easily create vector or array in class and how to access them如何在类中轻松创建向量或数组以及如何访问它们
【发布时间】:2013-12-04 21:21:19
【问题描述】:

例如,vector<double> A(5); 可以返回一个包含 5 个元素的向量。是否可以在我们自己构建的class 中做类似的事情?

例如,我有一个名为 Fruit 的类。我应该写什么构造函数,这样Fruit A(5); 可以返回我 5 apples。这意味着apples是这个类的私有成员,应该是一个大小为5的数组或向量。我没有写apples的细节的原因是我不知道如何正确声明它成员并创建它的构造函数。

最后,我创建Fruit A(5);之后,是不是只能通过在类中创建get()函数来访问这个数组的成员,还是有更方便的方法呢?

如果你能给我一些建议,我真的很感激。谢谢!

【问题讨论】:

    标签: c++ class constructor


    【解决方案1】:

    您希望将apples 存储在vectorarray 中。然后你想覆盖[] operator 来访问你想要的东西。所以像:

    class Fruit
    {
      private:
        vector<apple> apple_storage;
      public:
        int& operator[](int j) {return apple_storage[j];}
    };
    

    然后您可以轻松使用A[3] 访问您的apple_storage

    【讨论】:

    • 妈的,操作符压倒一切,我怎么会忘记!大佬,非常感谢。很有帮助!
    【解决方案2】:

    最简单的策略是让您的类包含一个容器。如果您不想为其编写访问器,请将其设为公共成员:

    class Fruit
    {
      public:
        Fruit() { } 
        Fruit(int asize) : basket_(asize) { } 
    
        vector<apple> basket_ ; 
    } ;
    

    然后你会创建它:

    Fruit A(5) ;
    
    // get an apple from Fruit
    apple tmpapple= A.basket_[1] ;
    

    【讨论】:

    • @Cancan:我们已将C 定义为类成员,因此初始化列表中的C(size) 表示“通过将size 作为参数传递给其构造函数来初始化C”。这里不用担心继承;正如 Vite 所说,从标准容器继承是个坏主意。
    • 让我把它重命名为 C -> 篮子_
    • @Cancan:您是在问如何创建对象并访问其公共成员?您以通常的方式创建对象,Fruit A(5); 或其他方式,并以通常的方式访问其公共成员,A.apple[3]。你的入门书没教你吗?
    • @ViteFalcon 并非所有继承都适用于多态性。 C++ 中的继承经常用于其他不需要虚拟析构函数的技术。并不是说我在这里是个好主意;我只是说没有虚拟析构函数并不一定意味着继承是一个坏主意。
    • @bames53:确实;失去所有有用的构造函数,包括 OP 特别想要的构造函数,这使它成为一个不完全好的主意(尽管您可以在 C++11 中减轻这种情况)。
    【解决方案3】:

    没有太多关于apple 的细节并假设它们有一个默认构造函数,这是一种天真的方法。

    class Fruits {
    public:
        typedef std::vector<apple> AppleArray;
        typedef AppleArray::iterator AppleIterator;
        typedef AppleArray::const_iterator AppleConstIterator;
    
        Fruits(int appleCount)
            : mApples(appleCount)
        {
        }
    
        ~Fruits()
        {
        }
    
        apple& getAppleAt(size_t index)
        {
            return mApples.at(index);
        }
    
        const apple& getAppleAt(size_t index) const
        {
            return mApples.at(index);
        }
    
        AppleIterator getAppleBegin()
        {
            return mApples.begin();
        }
    
        AppleIterator getAppleEnd()
        {
            return mApples.end();
        }
    
        AppleConstIterator getAppleBegin() const
        {
            return mApples.begin();
        }
    
        AppleConstIterator getAppleEnd() const
        {
            return mApples.end();
        }
    
        size_t getAppleCount() const
        {
            return mApples.size();
        }    
    private:
        std::vector<apple> mApples;
    };
    

    我假设这不是生产代码,它纯粹是为了学习 C++。如果您要在现实生活中设计类似的东西,您需要考虑AppleFruitFruits 更像是一个或多个水果的集合,其中一个是Apple。在这种情况下,您的Fruits 会更像std::vector&lt;Fruit*&gt; fruits;,然后您使用循环来初始化您想要在fruits 列表中的Apples 的数量。

    【讨论】:

      猜你喜欢
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-06
      • 2022-01-20
      • 2012-01-15
      相关资源
      最近更新 更多