2015-09-17 57 views
1

对于作业,我必须创建一个类的一些私人成员类。必须创建一个友元函数,它需要两个参数:指向对象的指针和指向对象私有成员的指针。 代码定义如下:C++ Friend函数无法访问私有成员;错误2248

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

class SomeClass { 
    friend int FriendFunction(bool SomeClass::*privMember, SomeClass *object); 
private: 
    bool Member1; 
    bool Member2; 
    bool Member3; 
public: 
    SomeClass() { 
     bool tmp; 

     if (rand() < 16384) 
      tmp = false; 
     else 
      tmp = true; 
     Member1 = tmp; 

     if (rand() < 16384) 
      tmp = false; 
     else 
      tmp = true; 
     Member2 = tmp; 

     if (rand() < 16384) 
      tmp = false; 
     else 
      tmp = true; 
     Member3 = tmp; 
    } 
}; 

int FriendFunction(bool SomeClass::*privMember, SomeClass *object) { 
    if (!(object->*privMember)) 
     object->*privMember = !(object->*privMember); 
    else 
     cout << "No changes made" << endl; 
    return 0; 
} 


int main() 
{ 
    srand(time(0)); 
    SomeClass *object1 = new SomeClass(); 

    FriendFunction(&SomeClass::Member1, object1); 
    FriendFunction(&SomeClass::Member2, object1); 
    FriendFunction(&SomeClass::Member3, object1); 

    return 0; 

} 

的友元函数调用不会编译和编译器报告C2248消息。 代码有什么问题? 我将不胜感激任何支持。

感谢

+0

我敢打赌,编译器错误是在你实际访问私有成员的'main'函数中。 –

+0

如果您有定义getter函数的自由(在您的任务中),那么您可以轻松访问指向您班级的私人成员的指针。然后你可以使用你的_FriendFunction_。 – sokin

回答

1

那是因为你正试图从main访问私有成员:

FriendFunction(&SomeClass::Member1, object1); 

这条线是从main指私人领域&SomeClass::Member1,并且,当然,失败。

+0

这确实是问题的原因。声明'int main()'作为SomeClass的朋友编译代码,但这当然只是证明问题出在哪里的方法。问题仍然存在:我如何将指针传递给FriendFunction的私人类成员? – Marko

+0

@Marko,在你的具体情况下,我会将变量存储在数组中,并在该数组中传递一个索引,而不是指向成员的指针。 – SingerOfTheFall

+0

我知道,通过索引是解决方案之一,但不幸的是,这并不能真正解决我的作业任务。该任务中定义的是bool类型的私有类成员的定义,它是一个带有两个参数(指向对象的指针和指向对象的私有成员的指针)的友元函数,在构造函数设置它时需要将私有成员更改为值true假。它可以以任务需要的方式完成吗? – Marko