简化表达概念的代码:
class classA
{
public:
private:
int a;
seta(int x);
};
//local prototype
void somefunction();
int main()
{
classA object; //create an object of the class
somefunction(object);
return 0;
}
void somefunction(classA &object)
{
object.seta(5);
}
}
如果我将seta()
移动到该类的公共部分,则没有错误并且会执行。
但是,如果我将seta()
移到私有部分,我会收到以下错误:
错误C2248: '
anonymous-namespace'::classA::seta' : cannot access private member declared in class '
匿名的命名空间' :: CLASSA'
如果该函数是私有的,只有这个类调用它,为什么会有问题?
编辑我正在将对象从main传递给本地函数
答案 0 :(得分:6)
调用seta()
的函数不属于classA
,因此这是一个错误;这就是private
的定义。如果您要让somefunction()
成为classA
的成员,或将其声明为friend
classA
,那么这将有效。
答案 1 :(得分:2)
函数somefunction()
不是classA
的成员函数。它是具有全局范围的函数,无法访问私有函数seta()
,就像main()
无法访问私有函数seta()
一样。
答案 2 :(得分:1)
私人会员只能由其会员及其朋友访问。此外,C ++中的每个成员函数都应该具有返回类型。随着说 -
void main() // 1
{
classA object; //2
somefunction();
}
main
的返回类型应为 int 。object
的范围仅在main
中,无法在somefunction
中访问,且未明确将其传递给函数。在你的编辑:
您按价值将object
传递给somefunction(classA)
。因此,object
(主要作用域)的副本将发送给somefunction
作用域object
。虽然它们的名字相同,但两者都不同。
void somefunction(classA object)
{ // ^^^^^^ Is a copy of the parameter passed.
object.seta(5); // This call isn't actually modifying the original parameter passed.
}// life time of argument,object, ends here.
如果你想修改传递给自身的参数,你应该通过引用传递它。
答案 3 :(得分:1)
这与“本地函数”(在其他函数中定义的函数)无关。这只是公共和私人成员。
如果某个成员是private
,则该仅可以由该类的其他成员或该类的明确朋友访问
答案 4 :(得分:1)
私有意味着只有成员函数和朋友才能访问它。两者都必须列在类声明中,但不是:
class classA
{
public:
private:
int a;
seta(int x);
};
在同一个文件中不会使该函数成为该类的一部分 - 只有类声明用于确定哪些函数具有访问权限。
答案 5 :(得分:1)
首先,回答你的主要问题:
如果函数是私有的,只有这个类调用它,为什么呢 有问题吗?
问题是private
类成员只能由该类的其他成员调用。函数somefunction()
不是classA
的成员,因此无权访问私有成员seta()
。
顺便说一句,在object
从somefunction()
传递main
时,您还应该仔细考虑自己在做什么。您按价值传递了object
,因此您创建的object
范围为somefunction()
的副本将在somefunction()
终止后立即销毁。那是你要的吗?
我怀疑您打算通过引用将object
从somefunction()
传递到main
,在这种情况下,您需要将somefunction()
声明为
void somefunction(classA &object)
答案 6 :(得分:1)
seta(int x)
是ClassA
的私人成员,因此只有ClassA
或friend class
ClassA
可以访问此成员。 somefunction()
不属于他们。