0

我是 C++ 的新手(来自 Java),我想在一个类中声明一个数组对象,但它的模板参数中需要一个整数值。我想我必须创建一个指向数组类的指针,但它不起作用..

我想做类似的东西:

class foo{
    private:
        array *myArray;
    public:
        foo(int size){
            //This line may be terribly wrong, but you see what I mean
            myArray = new array<int,5>(); 
        }
        ~foo(){
            free(myArray);
        }
}

但是,数组对象的正确初始化是:

array<int,5>

但是这种方式不允许我在运行时选择长度。

4

4 回答 4

12

我强烈建议您选择一本好的 C++ 入门书籍,而忘掉 Java。说真的,在学习 C++ 时,用 Java 思考会适得其反。它们可能具有相似的语法,但它们具有非常非常不同的语义。

您遇到的问题与语言的基本概念有关。在继续之前,您必须从一本好的 C++ 入门书籍中学习基础知识。


std::array(如果那是您正在使用的)不是用于此特定应用程序的正确类,因为您想在运行时选择长度。的大小std::array在编译时是固定的。

您应该改用std::vector它,它允许您在运行时指定(和更改)大小。

std::vector为您管理内存等标准容器;您不需要newdelete标准容器。存在标准容器是因为您不必自己手动处理内存。

#include <vector>

class foo
{ 
private: 
    std::vector<int> myArray; 
public: 
    foo(int size) : myArray(size) // Sets the size of the array
    {
    } 

    ~foo()
    { 
        // You don't need to delete anything; the vector takes care of itself.
    } 
};

请注意,我在这里没有使用指针、、、、new或任何地方。在 C++ 的很多很多情况下,您通常不需要指针。与流行的看法相反,在使用现代 C++ 技术时,您实际上需要做的手动内存管理很少。事实上,如果你正在使用或在你的 C++ 代码中,你可能做错了。deletemalloc()free()deletefree()

我想再次强调一本好的 C++ 入门书籍在帮助您学习该语言方面的重要性。任何优秀的 C++ 入门书籍都将涵盖std::vector以及如何利用它来发挥自己的优势。其他资源(例如std::vector参考资料)也可以提供帮助。熟悉他们。

于 2012-07-08T05:52:02.367 回答
2

我相信你正在寻找的是一个vector类。它是一个连续的类似数组的存储结构(很好的stackoverflow 问题),也是 C 数组的 C++ 替代方案。

你可以用一个指针来做,但由于vector它的大小是动态增长的,它并不那么重要。

这是您的示例中的一个示例:

#include <vector>

class foo{
    private:
        std::vector<int> *vecPointer;
    public:
        foo(int size){
            vecPointer = new std::vector<int>(size, 0);
                // 0 as default value, can be omitted
        }
        ~foo(){
            delete vecPointer;
        }
}

另一种方法是,如果您只想保留内存,但在类初始化时实际上没有元素,则只保留int内存而不是用具体值填充它。在这种情况下,构造函数看起来像:

foo::foo(int size){
     vecPointer = new std::vector<int>();
     vecPointer->reserve(size);
}

析构函数不会改变,并且在 内部class foo,您可以使用 将对象添加到保留大小,并且您可以以完全相同的方式vecPointer->push_back(5)添加更多对象(只有在此之后向量大小和它所占用的内存才会增长)。

另外,你真的想使用指针吗?你不必,你可以有一个法线向量:

#include <vector>

class foo{
    private:
        std::vector<int> vec;
    public:
        foo(int size){
            vec.resize(size, 0); // it's initialized as empty here
            // alternative, with reserve:
            // vec.reserve(size);
        }
        ~foo(){
            // no deletion needed like this
        }
}

这样,一切都得到了照顾,您不必记得删除。

于 2012-07-08T05:54:18.420 回答
0
foo(int size) {
    myArray = new int[size];  // Allocate n ints and save ptr in a.
    for (int i=0; i<size; i++) {
        myArray[i] = 0;    // Initialize all elements to zero. 
}
于 2012-07-08T05:54:34.643 回答
0

其他答案很好地回答了这个问题(您不需要管理内存),但假设您想自己管理内存(使用 new 运算符) -

然后使用唯一指针(智能指针)指向数组。

#include <memory>

class foo{
    private:
        std::unique_ptr<int> myArray;
    public:
        foo(int size){
            myArray.reset(new int[5]); 
        }
        ~foo(){
        }
}

您不需要在这里释放内存(就像向量一样)。

但请记住,最好的解决方案是使用向量(如所指出的那样),但由于问题标题为“指向数组的指针”,我添加了一种巧妙地指向数组的方法。

于 2012-07-08T06:27:18.437 回答