重复:函数重载按返回类型?
也许这是一个非常愚蠢的问题,但我不明白为什么我不能声明两个具有相同签名的方法,当它们具有不同的返回类型时.
public class MyClass
{
private double d = 0;
public double MyMethod()
{
return d;
}
public string MyMethod()
{
return d.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到一个编译错误,指出该类已经定义了具有相同参数类型的成员.
(显然,我在我的代码中使用它的方式并不像我的示例代码那么简单......但我认为它可以解决这个问题.)
我是否遗漏了有关OO设计的内容,这使得我正在尝试做一个OOP反模式?当然,编译器应该能够确定我尝试使用哪种方法,只要我具体告诉它我想要哪一种方法.
鉴于MyClass myClass = new MyClass();我希望以下代码可以工作:
double d = myClass.MyMethod();
string s = myClass.MyMethod();
Run Code Online (Sandbox Code Playgroud)
我希望以下代码有问题:
var v = myClass.MyMethod();
Run Code Online (Sandbox Code Playgroud)
但即使在var它的情况下也应该导致编译错误.
谁能看到我在这里做错了什么?我很高兴得到纠正.:-)
我正在使用borland turbo C++编译器(4.5).这是我的代码,但我得到的错误如下:'time :: add(time)'的多个声明.这里我重载了add()三次错误来自第3次重载,即"void add(time) T1)".
#include<iostream.h>
#include<conio.h>
class time
{
int h,m;
public:
void input()
{
cout<<"\n Enter hour :";
cin>>h;
cout<<"\n Enter min :";
cin>>m;
}
void display()
{
cout<<"\n time is : "<<h<<":"<<m;
}
void add(time t1,time t2)
{
h=t1.h+t2.h+(t1.m+t2.m)/60;
m=(t1.m+t2.m)%60;
}
time add(time t1)
{
time t3;
t3.h=h+t1.h+(m+t1.m)/60;
t3.m=(m+t3.m)%60;
return t3;
}
void add(time t1)
{
h=h+t1.h+(m+t1.m)/60;
m=(m+t1.m)%60;
}
};
int main()
{
time t1,t2,t3;
t1.input();
t2.input();
t3.add(t1,t2);
t3.display();
t3=t2.add(t1);
t3.display();
t2.add(t1);
t2.display();
return 0; …Run Code Online (Sandbox Code Playgroud) 我编写了一个在文本文件中搜索名称的函数.它返回向量,其中向量的每个元素是不同的名称.
现在我想在同一个文本文件中搜索数字并在向量中返回数字.
这可能是一个愚蠢的问题,但我想知道最好的方法是什么.通过编写第二个函数来重载函数,该函数返回向量或通过将类型替换为T来将我已经写入的函数转换为模板,如向量中所示.
我感到困惑的模板选项的原因是,我不知道,如果字符串和数值类型,如双和INT是在模板兼容.任何提示将不胜感激!谢谢.
为什么我不能做以下事情?
public interface ICommunication
{
int Send(Dictionary<string, string> d);
int Send(byte[] b);
Dictionary<string, string> Receive();
byte[] Receive(); // Error
}
Run Code Online (Sandbox Code Playgroud)
符号Receive()是不同的,但参数是相同的.为什么编译器会查看参数而不是成员签名?
ICommunication'已经定义了一个名为'Receive'的成员,它具有相同的参数类型.
我怎么能绕过这个?
我可以重命名Receive()如下,但我更喜欢保持命名Receive().
public interface ICommunication
{
int Send(Dictionary<string, string> d);
int Send(byte[] b);
Dictionary<string, string> ReceiveDictionary();
byte[] ReceiveBytes();
}
Run Code Online (Sandbox Code Playgroud) 我有这门课:
#define TYPE_INVALID 0x00
#define TYPE_BYTE 0x01
#define TYPE_SHORT 0x02
#define TYPE_INT 0x03
#define TYPE_LONG 0x04
#define TYPE_FLOAT 0x05
#define TYPE_DOUBLE 0x06
class BASIC_TYPE
{
private:
int8_t type;
int8_t byteValue;
int16_t shortValue;
int32_t intValue;
int64_t longValue;
float floatValue;
double doubleValue;
public:
BASIC_TYPE();
template<typename T> BASIC_TYPE(int8_t, T);
template<typename T> void set(T);
template<typename T> T get();
};
BASIC_TYPE::BASIC_TYPE()
{
type = TYPE_INVALID;
}
template<typename T> BASIC_TYPE::BASIC_TYPE(int8_t newType, T value)
{
type = newType;
set(value);
}
template<typename T> void BASIC_TYPE::set(T value)
{
switch(type) …Run Code Online (Sandbox Code Playgroud) 可能重复:
返回类型的函数重载?
嗨,
在重载时我们说参数列表必须按数字或类型不同,但在返回类型上无关紧要,为什么这样呢?
功能
//Function 1
int Add(int a, int b)
{return a+b;}
//Function 2
Double Add(Double a, Double b)
{return a+b;}
//Function 3
Double Add(int a, int b)
{return (Double)a+b;}
Run Code Online (Sandbox Code Playgroud)
函数1 2是重载的,其中函数1和3不是??? 原因???
任何帮助都非常感谢.
从某种程度上说,有些事情让我的大脑感到不安:我试图根据返回类型重载[]运算符.这是我需要做的:
class A {
private:
double* data_;
int N_;
public:
A (N=0):N_(N){
data_ = new double[N];
}
~A {delete[] data_;}
double operator[] (const int i) {
return data_[i];
}
double* operator[] (const int i) {
return &data[i]; // for example; in fact here i need to return some block of data_
}
};
Run Code Online (Sandbox Code Playgroud)
这段代码不会编译; 那是我的问题.有人可以帮我解决这个问题吗?
PS:我知道如何在返回类型上重载正常函数,例如:
int foo ();
string foo ();
Run Code Online (Sandbox Code Playgroud)
我使用了一些我在这个论坛中读到的技巧.通过这种方式:
struct func {
operator string() { return "1";}
operator int() { return 2; }
};
int main( …Run Code Online (Sandbox Code Playgroud) 我写了一段代码来确定一个典型的回文字符串.我通过返回字符串的reverse()方法的定义来做到这一点.我也渴望拥有相同的方法,但是在虚空形式中,因为未来的某些需求.当我将后者添加到代码中时,有效输出将变为无效.所以,问题是定义两个具有相同名称但返回类型不同的方法是否合法?如果没有,请让我知道如何使用void-type方法编写此代码.
class detector(object):
def __init__(self,string):
self.string = string
forbidden = (' ','!','?','.','-','_','&','%',"#",",")
def eliminator(self):
for item in self.forbidden:
if item in self.string:
self.string = self.string.replace(item,"")
def reverse(self):
return self.string[::-1]
#def reverse(self):
# self.string = self.string[::-1] I am prone to add this method
def check(self):
reversed = self.reverse()
if self.string == reversed:
print("Yes")
else:
print("No")
det = detector("rise to vote, sir!")
det.eliminator()
det.check()
Run Code Online (Sandbox Code Playgroud)
当我添加注释行时,有效的"是"变为"否"!
public int Add(int a, int b)
public float Add(int a, int b)
Run Code Online (Sandbox Code Playgroud)
返回类型不同.
这是超载还是超载?
如果访问类型不同,该怎么办?
public int Add(int a, int b)
private int Add(int a, int b)
Run Code Online (Sandbox Code Playgroud)
你能帮助我吗?