2016-10-09 33 views
-1

我有我的課/指針有問題。我有兩個類FirstClassSecondClassFirstClass有兩個指針:非法提及2類非靜態成員

MyClass *character1; 
MyClass *character2; 

我分配給這些指針後來在我的代碼,但現在我有我的SecondClass這裏我也有兩個指針:

MyClass *oldChar1; 
MyClass *oldChar2; 

我想設置oldChar相同的如character所示。我使用FirstClass中的friend子句在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將有方法setChars,它將MyFirstClass的一個實例作爲參數。例如

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個getter方法。我認爲這種方法更好,因爲它允許類隱藏他們的實現細節(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