2010-07-31 3 views
-1

У меня есть окна формы приложения 2 Текст box1,2 2 button1,2 я класс человек {есть получить, установить (строка, целое)} и я хочу объявить человека р ; , чтобы увидеть его как в двух нажатиях1,2, где я могу объявить класс OBJ

моя проблема в том, что я объявляю человек 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

Если вы отделите свой код четырьмя пробелами, он будет автоматически отформатирован для вас. Вы можете переформатировать свой код, чтобы его было легче читать. –

+1

И, пожалуйста, не кладите код на ту же строку, что и открывающая скобка. Это затрудняет чтение. –

+0

Этот код ОЧЕНЬ странный. 'string' в C++/CLI не является строкой .NET. Поскольку вы использовали 'using namespace std;', вы получили собственную строку в управляемом коде. Это нормально, если вы хотите повторно использовать существующий собственный код, но я не вижу никаких признаков этого. Почему бы не сделать 'person' a' ref class' и использовать 'System :: String ^' вместо 'std :: string'? Это позволит вам избавиться от уродливого вызова функции InteropServices. –

ответ

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' должен быть выделен в конструкторе и освобожден в деструкторе и финализаторе. –

Смежные вопросы