【问题标题】:C++ Using an object of a class within a function of that classC++ 在该类的函数中使用该类的对象
【发布时间】:2013-03-18 11:37:33
【问题描述】:

假设我有一个看起来像这样的头文件:

# filename: header.h
class myclass
{
 public:
    int myVariable; # arbitrary member variable
    foo(); # arbitrary function
    myclass() # default constructor
}

现在假设我想在一些 .cpp 文件中实现我的构造函数 [ myclass() ]: 我可以做一些事情,比如创建一个数组,对象,整数,任何东西 - 只是一些数组。 然后我可以遍历该数组并在我的构造函数定义中将其全部填满吗?

我问的原因是因为我希望我的任意成员函数 foo() 能够更改这个数组。这导致了问题 - 我是否将 myclass 的对象传递给 foo [ foo(myclass myclassObject) ?

或者我是否将这个对象的数组传递给 foo() ?

对此的任何澄清将不胜感激。我试图使示例尽可能不针对特定情况,但仍然足以让每个人都理解问题。谢谢!

【问题讨论】:

    标签: c++ oop class constructor


    【解决方案1】:

    您的构造函数确实可以创建一个数组 - 问题是构造函数返回后该数组会发生什么。

    • 一种合理的方法是将其保存在堆上 - 即使用 new[] 创建数组 - 但这意味着您需要保留指向该数组的指针以便之后访问它。最简单的方法是将指针对象添加到您的类成员数据。 foo() 然后可以使用该指针访问该数组。不幸的是,您必须使用自定义复制构造函数、赋值运算符和析构函数(谷歌三法则)或智能指针来确保正确复制或共享和销毁数组。

    • 您的问题对我来说意味着您不只是想要一个数组数据成员,这当然是最简单的解决方案。这样做的缺点是必须在编译时选择数组大小,而基于堆的数组可以在运行时调整大小。

    • 1234563
    • 构造函数也可以在静态数组中填充数据,但显然数组的生命周期独立于类的任何单个对象实例。您已经谈到了创建数组的构造函数,所以大概不想这样做。

    【讨论】:

    • 我真的很感激 - 发现它非常具有描述性。我发现我bold确实bold想要一个数组数据成员,我只是不知道如何声明它,直到我意识到我确实知道数组的大小。
    【解决方案2】:

    是的,您可以在构造函数中创建和“填充”一个数组,以便foo 使用它。事实上,这就是构造函数的目的(为你设置一切)。

    请注意,如果您希望foo() 能够使用该数组,则必须使该数组成为类定义的一部分。

    myclass.h

    class myclass {
        private:
            int* arr; // declared on the "heap"
        public:
            foo();
            myclass(int arraySize);
    };
    

    myclass.cpp

    #include "myclass.h"
    #include <stdio>
    
    myclass::myclass(int arraySize) :arr(new int[arraySize]) {}
    
    myclass::foo() {
        // prints the elements of the array we declared earlier
        for (int i = 0; i < 5; i++) {
            std::cout << arr[i] << std::endl;
        }
    }
    

    【讨论】:

    • int[] arr - 您不能不指定数组大小。
    • 非常感谢!我正要问一些语法,看到你更新它,就像我要添加评论一样。
    • Tony - 对于我的问题,数组的大小将是恒定的,但如果在运行时我无法确定大小,那么解决方案是什么?
    • @TonyD 谢谢。我同时使用 Java 和 C++,所以有时我会感到困惑。
    • @Joker 您可以将值传递给构造函数。我为你修改了我的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    • 2011-04-24
    • 1970-01-01
    • 2013-08-01
    • 2010-11-23
    • 1970-01-01
    • 2013-07-21
    相关资源
    最近更新 更多