【问题标题】:What's the syntax for creating an array of pointers to another class?创建指向另一个类的指针数组的语法是什么?
【发布时间】:2013-02-13 02:40:13
【问题描述】:

如果我有一个带有私有变量的类,它应该包含指向另一个类的指针数组,那么下面的语法是否正确?

class MyClass
{
    private:
        int arraySize;
        SomeOtherClass* classPtr[];
}

稍后,当我想在 MyClass 中接受 ifstream、从文件读取并填充数组的函数中为该数组动态分配内存时,我会这样做吗?

void createArray(std::ifstream& fin)
{
    //the first int is the array size
    fin >> arraySize;
    string tempString; //the file is formatted string int string int etc.
    int tempInt;

    classPtr[arraySize];

    for(int i = 0; i < arraySize; i++)
    {
        fin >> tempString;
        fin >> tempInt;
        //assume the constructor is defined
        classPtr[i] = new SomeOtherClass(tempString, tempInt);
    }

提前感谢您的宝贵时间。

【问题讨论】:

  • 您似乎不需要数组,为什么要一个?
  • 简短的回答是,因为这是作业所要求的。 classPtr 应该跟踪 SomeOtherClass 的多个实例。
  • 虽然没有任何东西拼写 array...
  • 你永远不能创建一个指向类的指针。
  • 也许这是一个糟糕的任务。它声明“创建另一个维护 SomeOtherClass 实例的私有数组的类。” “您将动态分配数组以使其具有确切的大小,然后通过从文件中读取来填充它。”

标签: c++ arrays pointers


【解决方案1】:

这是不正确的。您还不能在 C++ 中使用可变长度数组

应该是这样的

SomeOtherClass** classPtr;

createArray()

...
classPtr = new SomeOtherClass*[arraySize];
...

是的,忘记我所说的一切并使用std::vector

【讨论】:

    【解决方案2】:

    数组在编译时必须具有静态大小,但在您的情况下,您不知道大小,直到您在运行时从流中读取它。对于动态大小的数组,您应该改用vector

    std::vector<SomeOtherClass*> classPtr;
    

    然后在下面的代码中:

    classPtr.reserve(arraySize);
    .....
    classPtr.push_back(new SomeOtherClass(...));
    

    话虽如此,不建议在向量中使用原始指针,应该小心。阅读this answer 了解更多信息以及它是否适合您。很可能,您只需要 vector 的对象:

    std::vector<SomeOtherClass> vec;
    .....
    vec.push_back(SomeOtherClass(...));
    

    在使用 vector 对象时,您应该确保考虑对象的移动/复制语义,并确保它适合您的用例。

    【讨论】:

    • 拥有一个对象向量需要考虑在 push_back 期间移动/复制对象,以及向量是否必须改变容量。 unique_ptr 的向量可能会更好。
    • @beldaz 引用的链接为vector 的指针提供了很多替代方案,所以我不想重复这个答案。不过,我会在考虑移动/复制时添加注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多