在类定义

时间:2015-06-24 18:01:09

标签: c++ oop msvc12

我有一个由第三方编写的课程,类似于这个Foo.h:

class Foo
{
public:
    int Foo::dosomething(float x, float y, float z);

    //Other things here
};

在Foo.cpp中,dosomething是:

int Foo::dosomething(float x, float y, float z)
{    
    //Something
}

标题中函数名前的::是什么意思?当我创建一个新对象

Foo foo;

我无法访问dosomething函数:

foo.dosomething(1,2,3);

dosomething是如何被访问的?当我在dosomething之前删除头文件中的:::

class Foo
{
public:
    int dosomething(float x, float y, float z);

    //Other things here
};

我可以从Foo类型的对象访问dosomething。

2 个答案:

答案 0 :(得分:5)

将范围添加到类定义中的函数名是不正确的(并且许多编译器认为这是一个错误)。由于它已经在类的范围内,因此您实际上将函数范围定义为Foo::Foo::dosomething,这是错误的。

class Foo
{
public:
    int Foo::dosomething(float x, float y, float z);   // Shouldn't have Foo::
};

要回答关于::的作用的问题,它会指定函数的范围。考虑这两个函数

int dosomething(float x, float y, float z);
int Foo::dosomething(float x, float y, float z);

第一个是自由函数,后者是Foo类的方法,并且(因为它前面没有单词static)需要Foo的实例从。来打电话。

答案 1 :(得分:1)

一般情况下,对现有的类范围使用::范围运算符来引用自己的成员(即使它是多余的)也不是非法

  

在声明类成员之后,可以在其成员范围内查找成员名称   类。 [注意:即使该类是一个不完整的类,也是如此。例如,   struct X {
  enum E { z = 16 };
  int b[X::z]; //确定
  };
   C ++11§3.3.2¶5

问题是声明点的定义似乎排除了在成员声明中使用范围运算符(如果它是自己的名称)。

  

名称的声明紧接在其完整声明者(第8条)之后和初始化程序之前(如果有),除非如下所述。 [示例:
       int x = 12;
       { int x = x; }
  这里第二个x用自己的(不确定的)值初始化。 - 结束示例]
   C ++11§3.3.2¶1

在§3.3.2的其余部分后面的段落中没有类成员的例外。

即使有上述限制,类成员的语法也不禁止使用 qualified-id 作为成员名称。因此,接受显示的代码不是语法错误。但是,存在语义违规,应该发出诊断信息。