友元函数和派生类
Friend functions and derived classes
我正在尝试从定义了友元函数的 Base 派生 class。我想为我的派生 class 创建一个友元函数,它使用 Base 的友元函数,但保留我的派生 class:
的类型
#include<algorithm>
class Base
{
public:
Base(int i, int j, int k)
{
vect[0] = i;
vect[1] = j;
vect[2] = k;
}
~Base();
friend Base myMin (const Base& argA,
const Base& argB);
protected:
// Member data
int vect[3];
};
class Derived : public Base
{
public:
Derived(int i, int j, int k)
:
Base(i,j,k)
{
}
~Derived();
friend Derived doSomething(const Derived& argA,
const Derived& argB);
};
Base
myMin (const Base& argA,
const Base& argB)
{
int i = std::min(argA.vect[0], argB.vect[0]);
int j = std::min(argA.vect[1], argB.vect[1]);
int k = std::min(argA.vect[2], argB.vect[2]);
return Base(i,j,k);
}
Derived doSomething(const Derived& argA,
const Derived& argB)
{
// Does other stuff too...
return myMin(argA, argB);
}
int main(int argc, char *argv[])
{
Derived testA(2,4,6);
Derived testB(3,3,7);
doSomething(testA,testB);
return 0;
}
我明白为什么这不起作用(doSomething 被赋予了 return 的基础,但被告知 return 派生),并且这可能不是很好的 C++ 形式。我的 Base class 有大量与此类似的友元函数,有没有办法在我的 Derived class 中使用友元函数而无需修改它们?
谢谢
已编辑:供参考,错误是:
base.H: In function ‘Derived doSomething(const Derived&, const Derived&)’:
base.H:50:26: error: could not convert ‘myMin(const Base&, const Base&)((* &(& argB)->Derived::<anonymous>))’ from ‘Base’ to ‘Derived’
return myMin(argA, argB);
最明显的方法是将 doSomething()
更改为
Derived doSomething(const Derived& argA,
const Derived& argB)
{
Base temp(myMin(argA, argB));
Derived retval(temp.vect[0], temp.vect[1], temp.vect[2]);
return retval;
}
您可能还必须声明 doSomething()
也是 Base
的朋友。
在不了解你真正想做什么的情况下,很难给出进一步的建议。你需要这样做的事实是 "code smell" 的一个例子 - 一个积极的迹象表明你的设计存在缺陷,并且随着你的代码不断增长,你将继续需要像这样进行变通。这逐渐使更改代码变得越来越困难 - 每次更改一个部分,就必须解决其他问题。
我正在尝试从定义了友元函数的 Base 派生 class。我想为我的派生 class 创建一个友元函数,它使用 Base 的友元函数,但保留我的派生 class:
的类型#include<algorithm>
class Base
{
public:
Base(int i, int j, int k)
{
vect[0] = i;
vect[1] = j;
vect[2] = k;
}
~Base();
friend Base myMin (const Base& argA,
const Base& argB);
protected:
// Member data
int vect[3];
};
class Derived : public Base
{
public:
Derived(int i, int j, int k)
:
Base(i,j,k)
{
}
~Derived();
friend Derived doSomething(const Derived& argA,
const Derived& argB);
};
Base
myMin (const Base& argA,
const Base& argB)
{
int i = std::min(argA.vect[0], argB.vect[0]);
int j = std::min(argA.vect[1], argB.vect[1]);
int k = std::min(argA.vect[2], argB.vect[2]);
return Base(i,j,k);
}
Derived doSomething(const Derived& argA,
const Derived& argB)
{
// Does other stuff too...
return myMin(argA, argB);
}
int main(int argc, char *argv[])
{
Derived testA(2,4,6);
Derived testB(3,3,7);
doSomething(testA,testB);
return 0;
}
我明白为什么这不起作用(doSomething 被赋予了 return 的基础,但被告知 return 派生),并且这可能不是很好的 C++ 形式。我的 Base class 有大量与此类似的友元函数,有没有办法在我的 Derived class 中使用友元函数而无需修改它们?
谢谢
已编辑:供参考,错误是:
base.H: In function ‘Derived doSomething(const Derived&, const Derived&)’:
base.H:50:26: error: could not convert ‘myMin(const Base&, const Base&)((* &(& argB)->Derived::<anonymous>))’ from ‘Base’ to ‘Derived’
return myMin(argA, argB);
最明显的方法是将 doSomething()
更改为
Derived doSomething(const Derived& argA,
const Derived& argB)
{
Base temp(myMin(argA, argB));
Derived retval(temp.vect[0], temp.vect[1], temp.vect[2]);
return retval;
}
您可能还必须声明 doSomething()
也是 Base
的朋友。
在不了解你真正想做什么的情况下,很难给出进一步的建议。你需要这样做的事实是 "code smell" 的一个例子 - 一个积极的迹象表明你的设计存在缺陷,并且随着你的代码不断增长,你将继续需要像这样进行变通。这逐渐使更改代码变得越来越困难 - 每次更改一个部分,就必须解决其他问题。