2012-03-29 6 views
1

私はVisual Studio 2008 ProfessionalをC++でWindowsフォームで使用していますが、他のフォームに渡す必要があるクラスがあります。ので、ここで私がやっているものですクラスの型をWindowsフォームのコンストラクタに渡し、それをクラスポインタにキャストする必要があります。

//FirstFile.cpp

Usuario user; 
user.usuario = "test"; 
user.senha = "stackoverflow"; 
ChooseService cs(user);  
cs.ShowDialog(); 

//SecondFile.cpp

public ref class ChooseService : public System::Windows::Forms::Form 
    { 
    public: 

     Usuario* usuario; 


     ChooseService(Usuario user) 
     { 


      usuario = user;   
      //I need to cast the Usuario into Usuario*, so I can use it in the class 
      InitializeComponent(); 
      // 
      //TODO: Add the constructor code here 
      // 
     } 
     /... 

私は私のコメントで言ったように、私は「Usuario *」に「Usuario」をキャストする必要があるので、私は、私はこの

作ることができない方法で、「これを」使用してクラスにアクセスすることができますUsuario usuario;

;

ポインタの代わりに、Windowsフォームがあなたを許可しないため、ポインタを使用する必要があります。どうすればいいですか?何かトリックですか? 私は十分なことを願っています。ありがとう!

+2

'&user'は' Usuario * 'を生成しますが、ダングリングポインタを持つだけです... – ildjarn

答えて

1

オブジェクトからポインタの取得を取り、キャストは簡単ですwouldntは:

Usuario user; 
Usuario* pUser = &user; 

しかし、それはuserが自動ストレージであるため、無効なポインタをレンダリングかもしれないし、あるかもしれませんあなたが完了する前に破壊されたのはpUserです。私はあなたが動的にuserを割り当て、ポインタ取るChooseServiceのコンストラクタを変更示唆

:あなたの特定のケースで

Usuario* user = new Usuario; 
user->usuario = "test"; 
user->senha = "stackoverflow"; 
ChooseService cs(user); 


//... 

ChooseService(Usuario* user) {...} 

を、あなたの変種が働くだろう、両方のオブジェクトが同じ寿命を持っているが、それは危険なだからロングラン。

+0

ルチアン昇華の説明、ありがとうございました。私はFacebookのブラジルのリクエストを見ると、あなたはそれが私のハハだということを知っています。私は答えに過度に反応しましたが、私は午後いっぱい壁に頭をぶつけました。そこでここに行きます。 – Grego

+0

@Grego:実際にそのポインタをどこかで削除してください。それ以外の場合は古典的なメモリリークがあります。 – ildjarn

0

あなたは、あなただけのアドレス

+0

' user'のアドレスを取ると、コンストラクター本体が終了した後にダングリングポインターが発生します。つまり、それはコンパイルされますが、実行されません。 – ildjarn

+0

私はそれが与えられたと思ってそれをコピーしてからアドレスを取った。ポイントは、これは、これが実際にはなかったようなキャストを使ったタイプ変換だと思ったということでした。 –

+0

どこにコピーしますか? 'ref class'は値でネイティブオブジェクトを保持できません。引数が値渡しされ(結果的にコピーを作成する)という事実は_problem_です。 – ildjarn

関連する問題