c++ 特殊方法可见性

Posted

技术标签:

【中文标题】c++ 特殊方法可见性【英文标题】:c++ special method visibility 【发布时间】:2012-02-18 04:37:16 【问题描述】:

我有一个简单的对象,类型为“ObjectX”,带有一个名为“doSomething()”的简单方法。我想让 doSomething 只能由其他 ObjectX 访问。换句话说,如果某些东西要么是静态的,要么不是“ObjectX”类型的对象,它试图调用 doSomething,它将无法调用。但是,如果 ObjectX 类型的对象尝试调用该方法,它将能够。

这与私有方法不同,私有方法只能从它所在的同一个对象调用。如果有另一个相同类型的对象在不同的​​对象上调用该方法,它将被锁定.

【问题讨论】:

不,私有方法不限于从同一个对象调用。另一个相同类型的对象可以使用它,它不会被锁定。 @Seth 哦,真的吗?那我错了!你应该把它写成答案,我很乐意接受:) 【参考方案1】:

private 几乎完全符合您的要求。只有相同类型的对象才能使用private方法,其他对象可以在其他对象上调用这些函数(即private函数不限于调用对象)。

唯一与您描述的不同的是,同一类中的static 函数也可以使用private 函数。没有语言功能可以让您将函数限制为仅限对象(不包括 static 函数)。

【讨论】:

当你说静态方法可以访问它的时候……这是否意味着所有静态方法都可以访问它,还是仅限于同一个类中的静态方法? @GeorgesOatesLarsen 静态函数在同一个类中。【参考方案2】:

我不知道你从哪里得到你的事实。私有函数A::foo 可以被A 类型的任何对象调用。无论是在其自身上还是在另一个实例上。

class A

public:
  void foo(const A& other)  other.priv(); 

private:
  void priv() const 
;


int main()

  A a1, a2;
  a1.foo(a2);
  return 0;

【讨论】:

【参考方案3】:

在 C++ 中

Class A
  A a;
  doSomething()
    a.doSomething();
  

上面的代码可以工作。这就是复制构造函数工作的原因。

Class B
  A a;
  doSomethingElse()
    a.doSomething();
  

以上无论如何都行不通。

如果您还想提供对 B 的访问权限,并且通过在 A 类中指定 friend B; 来让 A 成为 B 的朋友。

【讨论】:

以上是关于c++ 特殊方法可见性的主要内容,如果未能解决你的问题,请参考以下文章

小白之旅6

我怎样才能捕捉到视图变得可见

可见光遥感目标检测主要难点与研究方法概述

C++之特殊类的设计(单例模式)

C++之特殊类的设计(单例模式)

在 C++ 中声明可见性/访问的方式有何不同?