2016-10-09 15 views
-1

私のクラス/ポインタに問題があります。 私は2つのクラスFirstClassSecondClassを持っています。私は後で私のコードでこれらのポインタに割り当てるが、今私は私のSecondClass私も2つのポインタ持っている場所2つのクラスの非静的メンバーへの不正な参照

MyClass *character1; 
MyClass *character2; 

MyClass *oldChar1; 
MyClass *oldChar2; 

を、私は同じにoldCharを設定したい FirstClassは二つのポインタを持っていますcharacterで示される。私はFirstClassの友人句を持つSecondClassの機能を作った。

void SecondClass::setChars() 
{ 
    *oldChar1 = FirstClass::character1; 
    *oldChar2 = FirstClass::character2; 
} 

結果: illegal reference to non-static member 'FirstClass::character1' 私はそれを得るいけない:/誰かが私を助けることができます?

+0

どのFirstClassのポインタを使用しますか?クラスとオブジェクトの違いを知っていますか? –

+0

私はその違いを知っています。私はちょうど 'oldChar1'を後で' character1'と同じオブジェクトに指定したいと思います。 – crooked

+0

どうやらあなたはその違いを知っていません... –

答えて

0

これを実行する方法はいくつかあります。

フレンド機能は両方のクラスで共有されています(source)。

friendファンクションは、MyFirstClassクラスとMySecondClassクラスのデータメンバーにアクセスできますが、friendファンクションには、使用するクラスのインスタンス(thisを参照)を伝える必要があります。

class MyClass { 

}; 

class MySecondClass; //forward declaration for later 

class MyFirstClass { 

private: 
    MyClass *character1; 
    MyClass *character2; 

public: 
    //friend function 
    friend void setChars(MyFirstClass& c1, MySecondClass& c2); //<---- friend function 

}; 

class MySecondClass { 

private: 
    MyClass *oldChar1; 
    MyClass *oldChar2; 

public: 
    //friend function 
    friend void setChars(MyFirstClass& c1, MySecondClass& c2); 

}; 

//define the friend function 
void setChars(MyFirstClass& c1, MySecondClass& c2) { 
    c2.oldChar1 = c1.character1; 
    c2.oldChar2 = c1.character2; 
} 

int main() { 

    MyFirstClass c1; 
    MySecondClass c2; 

    setChars(c1,c2); 

} 

フレンドクラス。 MySecondClassをMyFirstClassのフレンドにします。 MySecondClassには、パラメータとしてMyFirstClassのインスタンスをとるメソッドsetCharsがあります。例えば

class MyClass { 

}; 

class MySecondClass; 

class MyFirstClass { 

private: 
    MyClass *character1; 
    MyClass *character2; 

public: 
    friend MySecondClass; //<----- friend class 

}; 

class MySecondClass { 

private: 
    MyClass *oldChar1; 
    MyClass *oldChar2; 

public: 

    void setCharsUsingFriendClass(MyFirstClass& c1) { 
    oldChar1 = c1.character1; 
    oldChar2 = c1.character2; 
    } 


}; 

int main() { 

    MyFirstClass c1; 
    MySecondClass c2; 

    c2.setCharsUsingFriendClass(c1); 

} 

最後に2つのゲッターメソッドを使用します。私は、クラスが実装の詳細を隠すことができるので、このアプローチがより良いと思います(encapsulation)。

class MyClass { 

}; 

class MySecondClass; 

class MyFirstClass { 

private: 
    MyClass *character1; 
    MyClass *character2; 

public: 

    //define getters to access the private members 
    MyClass* GetCharacter1() {return character1;} 
    MyClass* GetCharacter2() {return character2;} 
}; 

class MySecondClass { 

private: 
    MyClass *oldChar1; 
    MyClass *oldChar2; 

public: 

    void setCharsUsingGetters(MyFirstClass& c1) { 
    oldChar1 = c1.GetCharacter1(); 
    oldChar2 = c1.GetCharacter2(); 
    } 
}; 

int main() { 

    MyFirstClass c1; 
    MySecondClass c2; 

c2.setCharsUsingGetters(c1); 

} 
+0

ありがとうたくさんの男。それは私がかなり正しくしなかったことに私の目を開いた:) – crooked

関連する問題