我有两个功能可以做同样的事情:他们添加两个数字。一个添加两个作为类成员的数字,另一个添加用户在类外部给出的数字。
有没有办法编写一个函数来添加两个数字并检查参数是用户输入还是类成员?
void myclass::add(){
cout<<this->a+this->b;
}
void myclass::add(int a,int b){
cout<<a+b;
}
答案 0 :(得分:6)
虽然你不能在一个函数中真正做到这一点,但常见的方法是编写两者中更灵活的方法,并将另一个用作调度程序:
void myclass::add(int a, int b) {
std::cout << (a+b);
}
void myclass::add() {
add(a,b);
}
现在,这段代码中有不同数量的气味......一个函数名重用于成员或只有一个输入(一个不触及对象状态的函数已经闻到它不是成员,或者是一个静态的)。在名为add
的函数内打印(如果它不返回值?)...
答案 1 :(得分:0)
免责声明:我不鼓励这样的编码。
好的,这是一个方法
void myClass::Add(int& a, int& b)
{
if (&a==&this->a)
{
std::cout << this->a + this->b
} else {
std::cout << a+b;
}
}
Ofc,像myClass-&gt; Add(10,4)这样的东西不会起作用......你需要一些堆栈变量来保存10和4个变量。
答案 2 :(得分:0)
所以你想要一个可以有两个不同参数的函数吗?这是不可能的。
void myclass::add(int a, int b)
{
cout << a + b << endl;
}
是你想要的;但你可以重载函数:
void myclass::add()
{
cout << memberA + memberB << endl;
}
在我看来,这比使用单个函数检查变量是否为成员要好得多;它使您的代码可读。不要害怕重载函数 - 这是使C ++很棒的事情之一。我创建了一个类来证明这一点:
class myClass
{
public:
myClass() : memberA(0), memberB(0) {}
~myClass() {}
void setNumbers(int a, int b)
{
memberA = a;
memberB = b;
}
void add(int a, int b)
{
cout << a + b << endl;
}
void add()
{
cout << memberA + memberB << endl;
}
private:
int memberA;
int memberB;
};
int main()
{
myClass m;
m.setNumbers(1, 2);
m.add();
return 0;
}
我测试了带有和不带参数的add函数,它们都输出了相同的结果。前者因为我使用了setNumbers(..)函数。实际上,您的第一个具有两个功能的方案是最合适的解决方案。
答案 3 :(得分:0)
在您真正想要一个单一功能时,使用optional默认参数的方法就是这样。
您的声明将是
void add(optional<int> a = optional<int>(), optional<int> b = optional<int>() );
然后在您的实施中:
a ? a.get() : this->a
这种方法的好处是可以混合成员和参数。例如:
obj.add(1);
obj.add(optional<int>(), 2);