2017-03-23 3 views
2

私はC++が新しく、クラス内の変数へのアクセスに問題があります。私がここまで読んできたことから、これまでグローバルを作成することは本当に悪い習慣でしたが、そうすることはできませんでしたが、クラスへのアクセスを他のどのように移動するかは分かりません。C++関数からクラスへのアクセスが定義されていません

これまでの検索では、クラス内で関数を設定して取得するように指示していましたが、オブジェクトが定義されているブロックでのみ使用できます。

基本的にmain()でクラスオブジェクトを定義し、main()のようなgameLoop()のような関数を呼び出すと、クラスオブジェクトをグローバルにすることなくその新しい関数の中でそのオブジェクトにアクセスできます。例えば

#include "stdafx.h" 
#include <iostream> 
using namespace std; 
#include <string> 

class Word 
{ 
    private: 
     string m_word; 
     int m_length; 
    public: 
     void set(string word, int length) 
     { 
      m_word = word; 
      m_length = length; 
     } 
}; 

void gameLoop() 
{ 
    word1.set(); //flags error as it cant acces the word1 object 
    //I want to be able to access word1 from here 
    //Not a copy because that wouldnt change the actual word1 
    //I dont want to define it in here because then it would be created again 
    //for each loop of gameLoop 
} 

int main() 
{ 
    Word word1; 
    int play = 1; 
    while (play ==1){ 
     gameLoop(); 
    } 
    return 0; 
} 

これは、主に単純化したバージョンですが、私はクラスが外部に格納したいゲームの目的のためではなく、gameLoop内部のゲームプレイ機能の数のためにアクセスできるようにし、クラスオブジェクトを変更します。

+2

引数 'gameLoop'に' word1'を渡します。 – Carcigenicate

+0

パラメータとして 'gameLoop(word word)'を渡します。 – user463035818

+2

おそらくリファレンスとして( 'gameLoop(Word&word)') – kim366

答えて

1

理想的には、関数の依存関係は、パラメータリスト内のステートであるべきです。 gameLoop関数にWordオブジェクトが必要な場合は、それを引数として渡します。そうすれば、関数がどのようなオブジェクトで動作する必要があるのか​​は明らかです。

void gameLoop(Word& word) 
{ 
    word.set(); 
    //^Obviously you need to supply args here. 
} 

int main() 
{ 
    Word word1; 
    int play = 1; 
    while (play ==1){ 
     gameLoop(word1); 
    } 
    return 0; 
} 

そして、あなたが機能でWordオブジェクトを変異していることから、あなたは参照することにより、それを渡す必要があり、さもなければあなただけのコピーを変更している:これは何かのようになります。

あなたの唯一の唯一の唯一のオプションは、単語オブジェクトをグローバルにすることですが、それはどうしても避けてください。 が発生したことをすべて考慮に入れる必要があるため、テストを難しくするため、問題を特定することが困難になります。

+0

この場合、word(gameLoopでは)word1と同じオブジェクト(mainから)ですか?独立したコピーではない? –

+1

@UoMDan参照( '&')で渡すと、yesになります。 '&'がなければ、コピーが作成されます。 – Carcigenicate

+0

ああこれは私が探していたものだと思います!私は、各ループで消えていくコピーを作っていたと思うが、これは私の後ろのもののように聞こえる。ありがとう! –

0

何があなたがアクセスしmainに作成したいので、あなたがこのようプログラムしている構造化している場合、あなたはgameloop

にパラメータとして渡す必要がありますしかし、これは、非常に悪いデザインですgameloopには引数として渡す必要があります。私は別のアプローチを考えています。

あなたはほどgameLoopにループ全体や変数の宣言を移動することができ:

void gameLoop() 
{ 
    Word word1; 
    int play = 1; 
    while (play ==1){ 
     word1.set(/*args*/); 
    } 
} 

int main() 
{ 
    gameLoop(); 
    return 0; 
} 

をこの方法では、あなたがgameloopに百万のものを渡す必要はありません。ゲームでは一般的に初期化とファイナライズが必要ですが、これはgameLoopの呼び出しの前後でmainで行うことができます。

元の質問に答えるには、gameLoop()に引数としてword1を渡す必要があります。だから、Word引数を受け入れるように関数を再定義し、word1を渡します。しかし、もう一度、私はあなたの現在のデザインが遅すぎる前に再考するだろう

+0

gameLoopも独自の関数を持っているので、word1についての情報を変更したいかもしれないので、私はそれを渡さなければならないと思う。 –

+0

デザイン変更が必要なことを強調したいのか分からない。これがマークされている巨大なプロジェクトでない限り、素晴らしいスケッチは学ぶのに最適な方法です。本当に悪いコードを書くまで、適切なデザインを理解することは難しいです。 – Carcigenicate

+0

@UoMDanあなたはまだそれを100%行うことができるので、私はこれと何か関係がありません。 – picklechips

関連する問題