【问题标题】:OOP can't get value from a classOOP 无法从类中获取价值
【发布时间】:2021-08-22 05:59:49
【问题描述】:

所以我在函数中读取了一个文件并将值设置为一个类。我想在另一个函数(另一个 .cpp 文件)中读取这些相同的值,但我无法让它工作。

这是我从 .txt 文件中读取值的代码。这似乎有效。我可以计算出我读取的值。

#include "branjeDatoteke.h"
#include "parametri.h"
#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;
void branjeDatoteke() {
    Parametri pin[101];
    string line;
    ifstream myfile("pin.txt");
    if (myfile.is_open())
    {
        for (int i = 0; i <= 100 && getline(myfile, line); i++)
        {

            pin[i].setPin(line);
            // cout << pin[i].readPin() << endl;
             //cout << line << '\n';
        }

        myfile.close();
        // cout <<"tole more delat: "<< pin[2].readPin() << endl;
    }

    else cout << "Unable to open file";
}

这是我想再次获得相同值的代码,但 cout 不起作用。我只是得到 cout 应该在的空白控制台。

#include <iostream>
#include "pin.h"
#include "parametri.h"
#include <string>
#include "branjeDatoteke.h"
using namespace std;
void pinPass() {
    Parametri pin[101];
    string pinKoda;
    branjeDatoteke();
    cout << pin[0].readPin() << endl;
    cout << "Vnesite pin: ";
    cin >> pinKoda;
    for (int i = 0; i <= 100; i++) {
        if (pin[i].readPin() == pinKoda) {
            cout << pin[i].readPin() << endl;
            cout << "KODA JE PRAVILNA" << endl;
        }
        else if (i > 100) {
            cout << "kode ni v sistemu" << endl;
        }
    }
}

【问题讨论】:

  • 您没有将任何东西从branjeDatoteke() 传递到pinPass()。您希望这些值如何到达那里?!
  • 仅供参考,术语“OOP”是指面向对象的编程——不是用对象编程。请仅在您进行一些疯狂的继承等时使用该标签。

标签: c++ function class oop


【解决方案1】:

pinPass 函数中的 Parametri 数组为空(或更准确地说,有垃圾值)。您从 pinPass 中调用 branjeDatoteke 函数,即 branjeDatoteke 函数然后创建它自己的参数数组(与 pinPass 函数中的不同),从文件中读取值并通过 cout 显示它。

branjeDatoteke 完成它的工作时,该函数的所有局部变量,包括 Parametri 数组都将被销毁,您的程序将跳转回 pinPass 函数。

要做你想要达到的目标,大概是两个函数都有一个公共数组,你可以将数组从 pinPass 传递给 branjeDatokete ,或者你可以告诉 branjoDatokete 到在堆上分配一个数组,然后返回一个指向它的指针。我想第一种方法更适合你想要实现的目标。

【讨论】:

    【解决方案2】:

    假设您的 Parametri 类是正确的,问题是您使用的是局部变量,因此每次调用函数时都会初始化它们。它们被分配在堆栈上,本地用于调用函数,并且不能在声明它们的函数之外使用,至少不是你这样做的方式。如果您两次调用该函数,您还必须假设必须重新初始化所有局部变量。解决此问题的一种方法是将您的 pin 变量提升为全局变量,如下所示:

    // your_file_one.cpp
    Parametri pin[101];
    
    void PinPass() {
      ...
    }
    

    如果你想在另一个cpp文件中使用它,那么你必须在另一个文件中重新声明变量,如下所示:

    // your_file_two.cpp
    extern Parametri pin[101];
    

    extern 关键字指定变量是在另一个编译单元中声明的 - 为简单起见,让我们将每个不是头文件的 C++ 文件想象为一个单独的编译单元。

    所以您的代码将如下所示:

    #include "branjeDatoteke.h"
    #include "parametri.h"
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstring>
    
    using namespace std;
    
    Parametri pin[101];
    
    void branjeDatoteke() {
        string line;
        ifstream myfile("pin.txt");
        if (myfile.is_open())
        {
            for (int i = 0; i <= 100 && getline(myfile, line); i++)
            {
    
                pin[i].setPin(line);
                // cout << pin[i].readPin() << endl;
                 //cout << line << '\n';
            }
    
            myfile.close();
            // cout <<"tole more delat: "<< pin[2].readPin() << endl;
        }
    
        else cout << "Unable to open file";
    }
    

    #include <iostream>
    #include "pin.h"
    #include "parametri.h"
    #include <string>
    #include "branjeDatoteke.h"
    
    using namespace std;
    
    extern Parametri pin[101];
    
    void pinPass() {
        string pinKoda;
        branjeDatoteke();
        cout << pin[0].readPin() << endl;
        cout << "Vnesite pin: ";
        cin >> pinKoda;
        for (int i = 0; i <= 100; i++) {
            if (pin[i].readPin() == pinKoda) {
                cout << pin[i].readPin() << endl;
                cout << "KODA JE PRAVILNA" << endl;
            }
            else if (i > 100) {
                cout << "kode ni v sistemu" << endl;
            }
        }
    }
    

    使用全局变量有比多次声明更好的方法,如果您要编写更大的程序,可能需要研究这些方法。此外,全局变量在某些情况下非常有用,但不能滥用,因为它们会使更大的应用程序更难阅读和维护。

    【讨论】:

    • 谢谢先生!我已经尝试将其设为全局,但由于它已经定义,所以出现了一些错误,现在我使用 EXTERN 它工作了!谢谢
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多