1

アプリケーションの GUI から変数の値を取得するクラス "A" があります。これらの変数の 1 つが「X」であるとしましょう。次に、別のクラス「B」で、これを「X」と呼び、その値を別の関数に渡したいと思います。

私がしたことは、クラス「B」で「objectA」と呼ばれるクラス「A」のオブジェクトを作成し、次のように「X」の値を呼び出したことです。

// class A:
void classA::function1(int gui_value){
    x= gui_value;
}

次に、別のクラスで:

//class B:
void classB::run(){
.
.
function2(/* I need to pass x here */); 
.
.
}

関数と x の両方がヘッダー ファイルで正しく定義されています。

私がしたことは、ヘッダーファイルにclassAのオブジェクト(objectAとしましょう)を作成し、次のように「objectA」を使用して「classB」の「function2」の「x」の値を呼び出すことです。

//class B:
void classB::run(){
.
.
function2(objectA->x); 
.
.
}

「x」の値が「5」に等しいとしましょう。function2 で「x」の値をデバッグすると、デバッグするたびに乱数が返されます。したがって、これらのランダムな値が既にメモリに存在していると推測しているだけです。つまり、「X」の値が正しく渡されていません。

オブジェクトは作成されますが、変数「x」の新しいインスタンスが毎回作成されると思います。つまり、classA から「x」の値を取得するのではなく、すべての変数を使用して classA のオブジェクトを作成するだけです。

私の問題は、変数の新しいインスタンスを作成せずに、classA で取得した「x」の値を直接 classB に渡す方法です。


アップデート:

Doctorlove の回答のおかげで、私のコードは正常に動作するようになりました。私の問題は、作成後に「objectA」を初期化し、それに値を割り当てることにありました。私が行っていたのは、オブジェクトを作成して「classB」に直接渡すことです。そのため、作成時にメモリに値があったのは新しいオブジェクトであったため、ランダムな値を取得していました。

4

3 に答える 3

1

プライベート int 変数 i を持つクラス A と、プライベート int 変数 X を持つクラス B があるとします。

class A{
private:
int i;  
// if you want to use x within A you have to declare the  object here 
B  objectB;
.....
public :
int getI();
int setI();
};

// the second class  B 
class B(){
private :
int X;
......
public :
int getX();
void setX();
..

};

main() 関数があるとしましょう

int main (){
  A objA;
  B objB;

  objB.setX(5);//X is now 5 
  objA.setI(objB.getx());  // i has the value of X which is 5 
...
}
于 2013-08-01T10:41:44.833 に答える
1

あなたが何をしようとしているのかは明らかではありません。こんなのあったら…

class A
{
    private:
    int X;//ignoring any thing about encapsulation for now
};

class B
{
//...
    public:
    void DoSomething()
    {
        A objectA; 
        //makes objectA another A each time we get here, with X uninitialised
        //use objectA.X which has random numbers in
    }

};

これは、説明した問題と同様に動作します。代わりにメンバーを作成objectAして適切に初期化すると、必要なことが行われる可能性があります。これclass Aまで通り、

class B
{
//...
    private:
    A objectA;
    public:
    B() 
    {
        objectA.X = 42;
    }
    void DoSomething()
    {
        //use member objectA.X 
    }

};

編集 明らかに私の例では、どこからともなく42を引き出しました。GUI から適切な値を取得した場合は、それを B のコンストラクターに送信します。値が変更された場合は、代わりにそれへの参照が必要になります。

explicit B(int gui_value)
{
    objectA.X = gui_value;
}

EDIT2objectA他の場所に 既存の場所がある場合は、それをコンストラクターに渡します

explicit B(const A & otherA)
    : objectA(otherA)
{
}

それが不可能な場合は、設計を改善する必要があります。見るコードがなければ、これ以上助けることはできません。

于 2013-08-01T10:43:35.530 に答える