友元函数返回 (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 文件中执行实现的主要内容,如果未能解决你的问题,请参考以下文章
4 C++基础4 类 const函数 转全局函数 返回*this 数组类。友元 函数 类 操作符重载