3

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

# 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() ?

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

4

2 回答 2

1

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

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

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

  • 如果您在堆栈上创建它,那么它将离开作用域并且之后无法访问(任何尝试通过在作用域内设置的指针或引用访问它都会导致未定义的行为)。

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

于 2013-03-28T05:46:09.920 回答
1

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

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

我的班级.h

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

我的类.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;
    }
}
于 2013-03-28T05:46:36.873 回答