【问题标题】:Is there a limit on accessing dynamically allocated arrays through class functions in C++?通过 C++ 中的类函数访问动态分配的数组是否有限制?
【发布时间】:2017-12-28 17:49:04
【问题描述】:

这是我为一个类编写的程序的开始,我试图让它读取一个包含许多浮点数的文件。使用双打应该不是问题。我假设使用 array1.readDataFromFile(); 调用我的函数 会访问array1 结构中动态创建的数组吗?然而当

这是头文件

// Specification file for the NuberArrayClass
//a.k.a NumberArrayClass.h file

#ifndef NUMBERARRAYCLASS_H
#define NUMBERARRAYCLASS_H

using namespace std;
// class declaration

class NumberArrayClass
{

private:
    int arraySize;
    double * numberArray = nullptr;

public:
    //constructor declaration
    NumberArrayClass();

    //member functions
    void readDataFromFile();
    void displayArray();

    //destructor
    ~NumberArrayClass()
    {
        delete[] numberArray;
    } // end of destructor


};
#endif // NUMBERARRAYCLASS_H

这是类函数文件

//NumberArrayClass.cpp file

#include "NumberArrayClass.h" //needed to access arry
#include <iostream>
#include <fstream> //needed for file read

using namespace std;





NumberArrayClass::NumberArrayClass()
{
    arraySize = 250;  
    numberArray = new double[arraySize];
}



void NumberArrayClass::readDataFromFile()
{

    //creating a read object and opening file.
   ifstream inFile;

   inFile.open("DoubleData.txt");

   int countIt = 0; //this is a counter

   if (!inFile.fail())
   {
        cout << "File open!" << endl;
        //this should populate the
       while (countIt < arraySize && inFile >> numberArray[countIt]);
       {
            countIt++; //incramenting counter. 
       }
    }
    else
    {
        cout << "File Read fail!" << endl;
    }//end of if/else statement.



 }//end of readDataFromFile


void NumberArrayClass::displayArray()
{

    for (int i = 0; i < arraySize; i++)
    {
       cout << numberArray[i] << endl;
   }

 }//end of displayArray

这是我的主要内容

//main .cpp file
#include <iostream>
#include "NumberArrayClass.h"

using namespace std;

int main()
{
    //creating our class object.
    NumberArrayClass array1;

    array1.readDataFromFile();

    array1.displayArray();

    system("pause");
    return 0;
}

我不确定是语法错误还是什么.. 文件打开但 array1.displayArray();吐出垃圾。

【问题讨论】:

  • 在那里检查:However when the.

标签: arrays function class visual-c++


【解决方案1】:

检查这一行:

while (... && inFile >> numberArray[countIt]);

operator&gt;&gt; 不返回操作成功,it returns the same ifstream it operates on(因此您可以链接调用):

拆分条件和分配,分配后检查eofbit 以了解您是否到达文件末尾。还有badbitfailbit你可能想看看。

关于您的标题问题Is there a limit on accessing dynamically allocated arrays through class functions in C++?:有一个实际限制,由您的 SO 和硬件规定,但如果这不是这里发生的情况。如果你遇到这样的问题,它会在这一行:

numberArray = new double[arraySize];

(旁注,你的析构函数应该是virtual,以防你决定从这个类派生)

【讨论】:

  • 这是正确的,看看我遇到的问题是我的读取而不是数组。需要弄清楚如何从以 '\n' 分隔的浮点数列表中读取。它们由空格分隔,但我的构建仅将最后一个浮点数加载到数组的第一个元素中。我通过向数组的构造函数添加一个初始化循环来发现这一点。我得到列表中的最后一个浮点数和一堆零。感谢您的意见!
【解决方案2】:

我发现这里有问题。 假设浮点数/双精度数小于arraySize。这意味着 while 循环将在 countIt 到达 arraySize 之前终止。 但是,您的显示函数会循环遍历数组的整个 arraySize 元素。 由于分配后数组没有初始化,这意味着这些元素包含垃圾。

我的建议是:

  1. 分配后初始化数组。
  2. 仅显示由 read 函数读取的元素数量。

【讨论】:

  • #2 是正确的,您应该只显示您知道有效的数据。但我建议反对#1,因为它是不必要的,如果你不打算触摸它们,将未初始化的值留在数组中没有任何问题(这意味着,做#2!)。
猜你喜欢
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
  • 2023-01-23
  • 2021-11-24
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多