2015-04-27 135 views
1

我現在正在處理一項任務,而且我已經將一個數據組的新成員添加到鏈接列表中。我已經搜索了很多東西,但是我一直無法找到解決問題的辦法。問題是我在全局聲明的6個變量(客戶和5個節點類型的變量)最初在Openbutton_Click中打開文件時被修改。但我無法稍後在addconf_Click中修改這些變量。通常情況下,我不會發布求助信息,但我的時間不多,無法弄清楚。我有很多麻煩格式化,請耐心等待。C++:不能修改全局變量

這裏是.cpp文件與myform.h去

#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; 
} 
+1

你是否檢查條件'(num!= -1 && pin!= -1 && name!=「」&& bal!= -1)'是否評估爲真?你有錯誤信息嗎?或者是什麼讓你覺得它不起作用? – user463035818

+0

順便說一句,你不必發表評論的代碼和正確的格式將有助於閱讀很多。 – user463035818

+0

我檢查過它,它確實評估爲真。我認爲某些事情被破壞的原因是因爲即使我給他們分配值,鏈接列表值也不會改變,並且我無法將新成員添加到鏈接列表。 –

回答

0

你在頭文件中聲明customers作爲int。請記住,標題文件是文字粘貼到它所包含的文件中的。因此,您將擁有該變量的許多實例。

正確的做法是將其定義在cpp文件中,並在頭文件中使用extern int customers使其成爲全局文件。

對於您的nodes變量,同樣的問題也是如此。你必須在一個cpp文件中定義它們,以便它們只存在於一個地方。

但是,使用像這樣的全局可變變量幾乎從來都不是一個好主意。

+0

所以我去了並在.h中創建了變量extern,並在.cpp中定義了它們,但問題仍然存在。 –

0

原來我錯過了一行代碼,正確地打印出列表的當前狀態。現在感覺像個完全白癡。感謝那些幫助你的人。