2010-07-31 67 views
-1

我的Windows應用程序的形式2 文本box1,2 2 button1,2 我有類人{已經獲取,設置(字符串,整數)} ,我想聲明 人員P ; 看到它在兩個按鈕1,2我在哪裏可以聲明類的obj

我的問題是我宣佈 人p;內部按鈕時按鈕結束 P〜人();被稱爲 所以我不能保存值

,當我打電話p.get我得到初始值

代碼

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 
     {person p; 
     //string str; 
    stringstr(constchar*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(textBox1->Text).ToPointer(); 
      p.set(str,int ::Parse(textBox2->Text)); 


private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) 
     {person p; 
      string str; 
     int ag; 
     p.get(str,ag); 

我聲明類如

class person 
{ 
public: 
    person();// create initial value 
    ~person();//descon 
    void set(string z,int a);//set value 
    void get(string &z,int &a);//get value 
private: 

    string name; 
    int age ; 

}; 

------------------------------------------------------------ 
person cpp 
#include "StdAfx.h" 
#include "person.h" 
#include "stdafx.h" 

using namespace std; 
using namespace System; 
    using namespace System::ComponentModel; 
    using namespace System::Collections; 
    using namespace System::Windows::Forms; 
    using namespace System::Data; 
    using namespace System::Drawing; 

person::person() 
{name="null"; 
age=-1; 

} 
person::~person() 
{ 
} 

void person::set(string z, int a) 
{name=z; 
age= a; 
} 
void person::get(string &z, int &a) 
{z =name; 
a=age; 
} 

我可以上傳所有解決方案嗎?

+1

如果您將代碼縮進四個空格,它將自動格式化爲您。你可能會考慮重新編寫代碼,以便閱讀。 – 2010-07-31 00:28:51

+1

請不要將代碼放在與前括號相同的行上。這使它很難閱讀。 – 2010-07-31 00:36:51

+0

這段代碼很奇怪。 C++/CLI中的'string'不是.NET字符串。既然你已經使用過'使用命名空間標準;'你已經在託管代碼中獲得了一個本地字符串。如果你想重用現有的本地代碼,這很好,但我在這裏沒有看到任何跡象。爲什麼不讓'person'成爲'ref class'並使用'System :: String ^'而不是'std :: string'?它可以讓你擺脫醜陋的InteropServices函數調用。 – 2010-08-01 02:15:37

回答

0

你想要做的是使p成爲表單對象本身的成員。這樣它就可以被所有的事件處理程序訪問。

只需將person p;帶出您的事件處理程序並將其放入您的表單中。在C#中,您只需將它放在第一個事件處理程序之上 - 我不確定這是您在C++/CLI中執行的操作,但值得一試。

person p; 

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    ... 
    // Use p here 
    p.set(str,int ::Parse(textBox2->Text)); 
} 


private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    ... 
    // It's still the same p here 
    p.get(str,ag); 
} 
+0

託管類型不能將本機類型作爲數據成員,但可以有指向本機對象的指針。所以它變成'person * p;','p-> set'和'p'必須在構造函數中分配並在析構函數和終結器中釋放。 – 2010-08-01 02:19:32