0

これはカプセル化を破りませんか?

Bh:

class B{
    int x, y;
public:
    B() : x(1), y(1) {}
    B(const B& obj) : x(obj.x), y(obj.y) {}

    int getx();
    int gety();

    friend void pass_private_members(B&);
};

B.cpp

void non_friend_pass_private_members(int& x);

int B::getx(){
    return this->x;
}

int B::gety(){
    return this->y;
}

void pass_private_members(B& obj){
    non_friend_pass_private_members(obj.x);
}

void non_friend_pass_private_members(int& x){
    x++;
}

main.cpp

int main(){
    B obj;
    pass_private_members(obj);
    cout << obj.getx() << endl;
    return 0;
}
4

2 に答える 2

3

コンパイラに、のプライベートメンバーを処理するfriend void pass_private_members(B&)ことを信頼するように指示していることを宣言します。プライベートメンバーで何をするかは、コンパイラの問題ではありません。これは、を呼び出すメンバー関数を持つことと同じです。pass_private_membersBnon_friend_pass_private_members

于 2013-03-25T04:31:32.793 に答える
2

はい

カプセル化のルールに違反します。しかし、C ++は、ある時点で「純粋に」OOPLの多くのルールを破っています。

私のお気に入りのC++引用を思い出させます:

C ++、友達があなたのプライベートにアクセスできる唯一の言語!

于 2013-03-25T04:31:59.543 に答える