友元函数返回 (void*):无法在 .cpp 文件中执行实现

Posted

技术标签:

【中文标题】友元函数返回 (void*):无法在 .cpp 文件中执行实现【英文标题】:Friend function returning (void*): cannot get implementation in .cpp file to work 【发布时间】:2013-07-14 10:20:23 【问题描述】:

这是我的代码的快捷方式:

//myClass.h
namespace toto

  class myClass
  
    friend void *myRoutine(void*);
    private:
      char* _name;
  


//myClass.cpp
using namespace toto;
void *myRoutine(void* arg)

  myClass* foo = static_cast<myClass*>(arg);
  if ( NULL != foo )
  
    cout << foo->_name;
  

使用 GCC 编译时,我收到错误“_name is private”。我绝对需要函数的签名,因为它被用作线程例程。而且我想避免将我的属性更改为 public..

如果有人可以帮助我,谢谢!

编辑:另外,myClass是在命名空间中定义的,在.cpp文件中我在开头放了一个“using namespace ...”。

【问题讨论】:

myRoutine 没有定义在同一个命名空间中吗? 【参考方案1】:

myClass 中的朋友声明声明了 toto::myRoutine,而您的函数定义定义了 ::myRoutine。在与myClass 相同的命名空间中定义myRoutine 以解决您的问题。

【讨论】:

就是这样,谢谢!但令我惊讶的是,没有其他错误告诉我没有实现朋友功能。无论如何,谢谢。 @Ricola3D 这是因为你从不调用朋友函数。 @juanchopanza 哦,对了,因为我定义了两个函数,我只调用 ::myRoutine !【参考方案2】:

另外,myClass是在命名空间中定义的,在.cpp文件中我在开头放了一个“using namespace ...”。

不要那样做。在.cpp文件中,必须在命名空间内定义函数,像这样

namespace toto

  void* myRoutine(void* arg)  ...

或者像这样

void* toto::myRoutine(void* arg)

【讨论】:

【参考方案3】:

myRoutine() 应该写在命名空间内,或者由

namespace toto

// write the function here

void *toto::myRoutine( //....

【讨论】:

【参考方案4】:

您可以在类中使用 get 方法,例如,

char* getname()

   return _name;

比调用 foo->getname().

【讨论】:

我给你的例子是一个非常快捷的方法。这包含在一个非常庞大的框架中,我想避免任何可能的公共访问,其他开发人员可能会错误地使用^^确实有些属性是聚合指针,因此我需要在我的例程中指向它们的非恒定指针.但我不希望其他人更改指向的对象。 这是访问类私有成员的标准方法 我知道,当您不需要某些类或功能的特定权限时,这是标准。否则你需要“朋友”关键字 试过了,没区别。此外,在阅读它(***.com/questions/6407691/…)之后,它导致朋友函数/类实际上没有被声明为成员,因此它在声明之前没有考虑任何私有/公共/受保护的关键字......也许是命名空间的问题?该实现被认为是一个新函数,而不是我朋友声明的函数的实现? 无论如何,这并不能回答问题。

以上是关于友元函数返回 (void*):无法在 .cpp 文件中执行实现的主要内容,如果未能解决你的问题,请参考以下文章

cpp►运算符重载与友元friend

4 C++基础4 类 const函数 转全局函数 返回*this 数组类。友元 函数 类 操作符重载

c_cpp 返回void函数

友元函数

如何实现一个类函数声明为另一个类的友元,并且两个类在不同的文件中, 举例如下:

聊聊C# CLR中那些大量的友元函数,友元类的底层玩法