1

我的 C++ 代码有很多问题,但我不明白为什么。

我正在开发一个包含 myclass.h 和 myclass.cpp 的静态库 libmylib.a。

我遇到的问题是这样的:

// myclass.h
class myClass{
   public:
      myclass();
      myclass(a,b);

     // some methods.

   private:
    int a ;
    int b ;
};

在 myclass.cpp 中,我定义了构造函数方法等,一切正常:我可以在 main.cpp 代码中使用该库。

然后我添加了一个朋友功能:

// myclass.h
class myClass{
   public:
      myclass();
      myclass(a,b);
      friend void foo() ;

     // some methods.

   private:
    int a ;
    int b ;
};

我像这样在 myclass.cpp 中定义 foo 函数

// myclass.cpp
void foo(){
  cout << "In foo function " ;
}

问题是,如果我尝试在 main.cpp 中使用 foo() ,我会收到一个编译错误,指出:

//main.cpp
#include "myclass.h" // foo() is declared here!

foo() ;

main.cpp:62:6:错误:“foo”未在此范围内声明

现在我真的不明白问题出在哪里。我注意到在添加朋友功能后,链接器似乎不再使用 mylib,但我不明白为什么。而且这很奇怪,因为如果我在 main.cpp myclass 中注释 foo() 并且它的方法可以毫无问题地使用。

我究竟做错了什么?我花了两个小时试图弄清楚,但真的无法理解!

解决方案:按照答案中的建议:

// myclass.h
void foo() ; // the function has to be declared outside the class

class myClass{
   public:
      myclass();
      myclass(a,b);
      friend void foo() ; // but here you have to specify that 
                          // is a friend of the class!
     // some methods.

   private:
    int a ;
    int b ;
};
4

2 回答 2

2

这不是链接器错误,而是编译器错误。编译器告诉你它不知道如何调用 function foo,因为它缺少它的定义或声明。

将函数声明为友元并不能替代正确的声明。当你说foo是朋友时,你不也介绍foo成一个范围。从某种意义上说,友谊声明是你班级的一个私人细节,从外面看是不可见的。

为了在 C++ 中使用函数,您需要先声明它。这通常通过与实现文件对应的头文件来完成,但您可以简单地这样做:

无效的富();

如果foo在与 相同的文件中定义main,您可以foo提前main解决问题(编译器可以在第一次使用之前查看函数定义)。

于 2012-09-21T13:27:05.217 回答
0

使用前是否声明foo过:

#include "header_where_foo_is_declared.h"
int main()
{
   foo();
}

或者

void foo();
int main()
{
   foo();
}

???

于 2012-09-21T13:26:15.383 回答