嵌套类的友元函数的定义体放在何处。
如下:我的程序。
back.h文件
#pragma once
//01背包问题类
class back
{
public:
back(void);
back(int size,double volumn,double* value,double* weight);
~back(void);
double operator()(bool *include);//完成对背包问题的解决,返回背包所能容纳的最大值,include[i]表示第i种物品是否包含。
private:
back &operator=(const back&){}
back(const back&){}
//用优先队列式分支限界法时所用的结点类
struct node
{
friend bool operator<(const node&,const node&);
//bool operator<(const node&)const;
bool*include;
double value,
weight;
int level;
};
int size;
double volumn,
*value,
*weight;
};
back.cpp文件
#include "StdAfx.h"
#include "back.h"
#include <queue>
//bool back::node::operator<(const node&n)const
//{
//return value>n.value;
//}
bool operator<(const back::node&node1,const back::node&node2)
{}
back::back(void)
{
this->size=0;
this->volumn=0.0;
this->value=NULL;
this->weight=NULL;
}
back::back(int size,double volumn,double *value,double *weight)
{
this->size=size;
this->volumn=volumn;
this->value=value;
this->weight=weight;
}
back::~back(void)
{
if(NULL!=value)
delete []value;
if(NULL!=weight)
delete[]weight;
}
double back::operator()(bool *include)
{
std::priority_queue<node> nodequeue;
node root;
root.weight=0.0;
root.value=0.0;
root.level=0;
root.include=new bool[size];
nodequeue.push(root);
double maxvalue=0.0;
while(!nodequeue.empty())
{
node extendnode=nodequeue.top();
if(size==extendnode.level)
{
if(extendnode.value>maxvalue)
{
maxvalue=extendnode.value;
for(int i=0;i<size;++i)
include[i]=extendnode.include[i];
}
}
else
{
node sonnode=extendnode;
sonnode.include =new bool[size];
for(int i=0;i<extendnode.level;++i)
sonnode.include [i]=extendnode.include [i];
++sonnode.level;
sonnode.include[extendnode.level]=false;
nodequeue.push(sonnode);
if(extendnode.weight+weight[extendnode.level]<=volumn)
{
sonnode.value+=value[extendnode.level];
sonnode.weight+=weight[extendnode.level];
sonnode.include =new bool[size];
for(int i=0;i<extendnode.level;++i)
sonnode.include [i]=extendnode.include [i];
sonnode.include[extendnode.level]=true;
nodequeue.push(sonnode);
}
}
nodequeue.pop();
delete[]extendnode.include;
}
return maxvalue;
}
在友元函数的定义部分会提示back::node不可访问,这个我也明白,可是该把定义体放哪里呢
[解决办法]
friend bool operator<(const node&,const node&);放外围类里面就是了。
[解决办法]
放在外边,友元能访问的是类的static成员或者是某个实体的成员,如back::node的访问可以为:
void pirnt1(const back& b){
std::cout<<b.node.value<<std::endl;//普通成员
back::fun1();//static 静态成员
}