2017-10-12 6 views
-1

いくつかの条件でクラスへのポインタを取得するために、C++で関数を作成します。私はクラスの複数のインスタンスを持っていて、番号で識別されています。番号に応じて、対応するインスタンスを取得したい。 C#でC++のC#と同じです。

はそれはのようになります。

class main 
{ 
    private Example item1; 
    private Example item2; 
    private Example item3; 
    private Example item4; 

    public bool InitializeItem(int itemID) 
    { 
     bool isInitialized = false; 
     Example item; 
     if (tryGetItem(itemID, out item)) 
     { 
      item = new Example(itemID); 
      isInitialized = true; 
     } 
     return isInitialized; 
    } 

    private bool tryGetItem(int itemID, out Example item) 
    { 
     bool canGet = false; 
     item = null; 
     switch (itemID) 
     { 
      case 1: 
       item = item1; 
       canGet = true; 
       break; 
      case 2: 
       item = item2; 
       canGet = true; 
       break; 
      case 3: 
       item = item3; 
       canGet = true; 
       break; 
      case 4: 
       item = item4; 
       canGet = true; 
       break; 
     } 
     return canGet; 
    } 
} 

class Example 
{ 
    int number { get; set; } 
    public Example(int i) 
    { 
     number = i; 
    } 
} 

しかし、C++で、私は少しの参照とポインタと混同です。 this one(フランス語)のようなチュートリアルを読んだ。私は基本的なポインタを理解しましたが、クラスと機能で私は失われています。最初の答えを

は、私はに私のコードを変更:

Example item1; 
Example item2; 
Example item3; 
Example item4; 

bool tryGetItem(int b, Example &ptr) 
{ 
    bool canGet = false; 
    ptr = NULL; 
    switch (b) 
    { 
    case 1: 
     ptr = item1; 
     canGet = true; 
     break; 
     /* etc */ 
    } 
    return canGet; 
} 

bool InitializeItem(int id) 
{ 
    bool isInit = false; 
    Example ptr = NULL; 
    if (getParam(id, ptr)) 
    { 
     ptr = Example(id); 
     isInit = true; 
    } 
    return isInit; 
} 

しかし、それは動作しません。私は、デバッグしようとしましたgetParam(1, ptr)が真です、{..}変数ptrは正しく設定されていますが、item1は変更されません。

編集: 私はそれが可能な重複投稿と同じ問題だとは思わない。 ptrtryGetItemに変更したくない場合はtryGetItemを使用してptrを私のitemXの1つにする必要があります。 tryGetItemに値1を使用した後、ptrを変更すると、item1も変更する必要があります。

+5

"参照渡し" "&'を検索し、[良いC++本](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を読んでください – UnholySheep

+0

C++作品はC#とは異なる方法で終了します。オブジェクトは通常あなたが扱うように扱われ、 'int'は例えばC#で扱われます。 C++のオブジェクトは通常、「ヒープ上のオブジェクトへの参照」ではなく、「オブジェクトが単なるintなのでオブジェクトは単なるもの」 –

+0

一般に、出力を返す方が出力パラメータよりも優先されます。 –

答えて

2

参照を使用します。

bool tryGetItem(int b, Example & var) 
{ 
} 

あなたは非常に単純な、それを使用することができます。

int main() 
{ 
    Example var; 
    tryGetItem(42, var); 
} 

本当に必要な場合を除き、他の解決策は、C++で裸のポインタを使用してavoir、利用できないので、参照またはスマートを好みますポインタ。あなたのケースでは、リファレンスが最良の選択であり、outを完全にエミュレートします。

+0

お返事ありがとうございます。私はあなたの解決策を試しましたが、 'tryGetItem(2、var);'( 'item2'を指す)と' var = Example(2) 'を実行すると' var'変数は正しく2に設定されますが、 'item2'変更されません。 –

関連する問題