首页 > 解决方案 > OOP 无法从类中获取价值

问题描述

所以我在一个函数中读取一个文件并将值设置为一个类。我想在另一个函数(另一个 .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;
        }
    }
}

标签: c++functionclassoop

解决方案


假设您的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;
        }
    }
}

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


推荐阅读