c++ - 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;
}
}
}
解决方案
假设您的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;
}
}
}
使用全局变量有比多次声明更好的方法,如果您要编写更大的程序,您可能需要研究这些方法。此外,全局变量在某些情况下非常有用,但不能滥用,因为它们会使更大的应用程序更难阅读和维护。
推荐阅读
- javascript - 上传单张图片
- kubernetes - 为什么 Kubernetes 配置允许 K8 仪表板连接,但不允许通过 Java API?
- python - 从其他列值匹配的 dataframe2 更新 dataframe1 列中的值
- angularjs - 如何将 \n 与字符串一起替换为空格
- python - 如何从 Python 脚本访问位于 HDFS 中的目录?
- powershell - 使用 Mir 参数的 Robocopy Maxage Minage
- javascript - 将 Javascript 变量传递到 HTML 代码中以用作参数
- ios - 必须将可选类型 String 的值解包为 String 的值类型?
- rust - 如何从产生数据块的慢速处理侧线程流式传输超级请求的正文?
- xml - XmlStreamingMarkupBuilder 不接受绑定到版本 2.5.7 的 xmlns 命名空间