可以从本地函数调用类的私有函数吗?

时间:2011-08-23 17:47:39

标签: c++ oop class object

简化表达概念的代码:

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传递给本地函数

7 个答案:

答案 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();
}
  1. main的返回类型应为 int
  2. object的范围仅在main中,无法在somefunction中访问,且未明确将其传递给函数。

  3. 在你的编辑:

    您按价值将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()

顺便说一句,在objectsomefunction()传递main时,您还应该仔细考虑自己在做什么。您按价值传递了object,因此您创建的object范围为somefunction()的副本将在somefunction()终止后立即销毁。那是你要的吗?

我怀疑您打算通过引用将objectsomefunction()传递到main,在这种情况下,您需要将somefunction()声明为

void somefunction(classA &object)

答案 6 :(得分:1)

seta(int x)ClassA的私人成员,因此只有ClassAfriend class ClassA可以访问此成员。 somefunction()不属于他们。