gpt4 book ai didi

C++:不能修改全局变量

转载 作者:太空宇宙 更新时间:2023-11-04 13:34:56 27 4
gpt4 key购买 nike

我现在正在处理一项任务,但在将数据组的新成员添加到链表时遇到了一些困难。我已经用谷歌搜索并查看了所有内容,但我一直无法找到解决问题的方法。问题是当我在 Openbutton_Click 中打开文件时,我全局声明的 6 个变量(客户和 5 个节点类型变量)最初被修改。但是我无法稍后在 addconf_Click 中修改变量。通常我不会发帖求助,但我时间不多了,想不通。我在格式化时遇到了很多问题,请耐心等待。

这是 myform.h 附带的 .cpp 文件

#include "MyForm.h"

using namespace System;
using namespace System::Windows::Forms;
using namespace std;

int customers = 0;
node *current;
node *first;
node *last;
node *temp;
node *previous;


[STAThread]
void Main(array<String^>^ args) {
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);

Project1::MyForm form;

Application::Run(%form);
}

这一切都在 myform.h 中

#pragma once
#include <fstream>
#include <string>
#include <iostream>
#include <sstream>
#include <msclr\marshal_cppstd.h>
#include "header.h"

using namespace std;

struct node{
account customer;
node *next;

};

extern int customers;
extern node *current;
extern node *first;
extern node *last;
extern node *temp;
extern node *previous;

private: System::Void Openbutton_Click(System::Object^ sender, System::EventArgs^ e) {
ifstream fin;

openFileDialog1->ShowDialog();

String^ filenname = System::IO::Path::GetFileName(openFileDialog1->FileName);
std::string filename = msclr::interop::marshal_as<std::string>(filenname);

fin.open(filename);


if (fin){
this->label2->Text = "File Opened";
}
else
this->label2->Text = "Failed to Open File";

String^ menu;
String^ temp;
string input;
string name;
string numstr;
string pinstr;
string balstr;
int num;
int pin;
float bal;

first = new node;

getline(fin, input);

numstr = input.substr(0, 3);

stringstream convert3(numstr);
convert3 >> num;


name = input.substr(8, 16);

name.erase(name.find_last_not_of(" \n\r\t") + 1);

pinstr = input.substr(24, 4);


balstr = input.substr(30, 7);



stringstream convert(pinstr);
convert >> pin;

stringstream convert2(balstr);
convert2 >> bal;

first->customer.setNum(num);
first->customer.setName(name);
first->customer.setPin(pin);
first->customer.setBal(bal);
first->next = 0;

numstr.clear();
name.clear();
pinstr.clear();
balstr.clear();

current = first;

customers++;

while (fin){
customers++;
previous = current;
current->next = new node;
current = current->next;

getline(fin, input);

numstr = input.substr(0, 3);

name = input.substr(8, 16);

name.erase(name.find_last_not_of(" \n\r\t") + 1);

pinstr = input.substr(24, 4);

balstr = input.substr(30, 7);

stringstream convert3(numstr);
convert3 >> num;

stringstream convert(pinstr);
convert >> pin;

stringstream convert2(balstr);
convert2 >> bal;


current->customer.setNum(num);
current->customer.setName(name);
current->customer.setPin(pin);
current->customer.setBal(bal);

}
last = previous;
last->next = 0;
customers--;
cout << "All accounts loaded, system ready." << endl;
// Print and fill the textbox
current = first;

menu = "Account List:" + customers + "\r\n " + "Num | Account Holder | Pin | Balance\r\n";


for (int c = 0; c < customers; c++){
menu += current->customer.getNum();
menu += " | ";
temp = gcnew String(current->customer.getName().c_str());
menu += temp;
menu += " | ";
menu += current->customer.getPin();
menu += " | $";
menu += current->customer.getBal();
menu += "\r\n";

if (current->next != 0){
current = current->next;
}
else
c = customers;
}


textBox1->Text = gcnew String(menu);
launch->Visible = true;
addCust->Visible = true;
remCust->Visible = true;
refList->Visible = true;
}

private: System::Void addconf_Click(System::Object^ sender, System::EventArgs^ e) {
int num = -1;
string name = "";
int pin = -1;
float bal = -1;
bool match = false;

string numstr = msclr::interop::marshal_as<std::string>(addnumbox->Text);
num = stoi(numstr);
name = msclr::interop::marshal_as<std::string>(addnamebox->Text);


name.erase(name.find_last_not_of(" \n\r\t") + 1);
string pinstr = msclr::interop::marshal_as<std::string>(addpinbox->Text);
pin = atoi(pinstr.c_str());

string balstr = msclr::interop::marshal_as<std::string>(addbalbox->Text);
bal = stof(balstr);

if (num != -1 && pin != -1 && name != "" && bal != -1){

current = new node;
last->next = current;
current->customer.setNum(num);
current->customer.setName(name);
current->customer.setPin(pin);
current->customer.setBal(bal);
current->next = 0;


last = current;
customers = customers + 1;
num = -1;
pin = -1;
name = "";
bal = -1;


}


}

header.h在这里

#include <string>
#include <iostream>

using namespace std;


class account{
private:
int accNum;
int accPin;
string accName;
float accBal;

public:
void setNum(int num);
void setPin(int pin);
void setName(string name);
void setBal(float bal);
void deposit(float money);
void withdraw(float money);

int getNum();
int getPin();
string getName();
float getBal();
};

void account::setNum(int num){
accNum = num;
}

void account::setPin(int pin){
accPin = pin;
}

void account::setName(string name){
accName = name;
}

void account::setBal(float bal){
accBal = bal;
}

int account::getNum(){
return accNum;
}

int account::getPin(){
return accPin;
}

string account::getName(){
return accName;
}

float account::getBal(){
return accBal;
}

void account::deposit(float money){
accBal = accBal + money;
}

void account::withdraw(float money){
accBal = accBal - money;
}

最佳答案

您在头文件中将 customers 声明为一个 int。请记住,头文件是直接粘贴到包含它的文件中的。因此您将有许多该变量的实例。

正确的做法是在 cpp 文件中定义它,并通过在头文件中使用 extern int customers 使其成为全局的。

同样的问题也适用于您的节点-变量。您必须在 cpp 文件中定义它们,以便它们只存在于一个地方。

但是,像这样使用全局可变变量几乎不是一个好主意。

关于C++:不能修改全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29895739/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com