C++ 在c+中使用函数作为运算符重载+;

C++ 在c+中使用函数作为运算符重载+;,c++,operators,operator-overloading,overloading,C++,Operators,Operator Overloading,Overloading,我必须写一个程序作为缓冲区工作。我用一些方法创建了一个类,比如AddToBuffer,其中包含char*、int、string、类的另一个实例等的重载。我的任务还包括创建一些运算符重载。所以我想出了一个主意,使用+运算符添加到缓冲区,工作原理与AddToBuffer相同。我是否真的必须为所有参数创建重载,或者可以将“别名”operator+添加到AddToBuffer。或者我应该将所有AddToBuffer更改为operator+ 提前感谢。我希望您可以制作一个类似以下内容的模板: cla

我必须写一个程序作为缓冲区工作。我用一些方法创建了一个类,比如
AddToBuffer
,其中包含
char*
int
string
、类的另一个实例等的重载。我的任务还包括创建一些运算符重载。所以我想出了一个主意,使用+运算符添加到缓冲区,工作原理与
AddToBuffer
相同。我是否真的必须为所有参数创建重载,或者可以将“别名”
operator+
添加到
AddToBuffer
。或者我应该将所有
AddToBuffer
更改为
operator+


提前感谢。

我希望您可以制作一个类似以下内容的模板:

   class someclass
   {
     ...
     template<typename T>
     someclass operator+(T a)
     {
         return AddToBuffer(a); 
     }
     ...
   }
class-someclass
{
...
模板
someclass运算符+(ta)
{
返回AddToBuffer(a);
}
...
}

由于您没有详细解释AddToBuffer是如何工作的,因此很难说要调用什么来制作等等,我希望您可以制作一个类似以下内容的模板:

   class someclass
   {
     ...
     template<typename T>
     someclass operator+(T a)
     {
         return AddToBuffer(a); 
     }
     ...
   }
class-someclass
{
...
模板
someclass运算符+(ta)
{
返回AddToBuffer(a);
}
...
}

由于您没有详细解释AddToBuffer是如何工作的,因此很难说要制作什么等

因为其他人已经回答了这个问题(我想),我只想补充几句个人经验:

使用操作符重载很酷。使用模板类很酷。使用多态性很酷。然而,cooler并不能使代码变得更好;肖特也没有。之所以使用string.operator+而不是queue.operator+,是有原因的。运算符仅适用于您执行与运算符相关的操作时。向缓冲区添加内容不是其中之一。我给你举个例子。比较一下:

Stack b;
int i;
while ((i = --b) > 0)
    b--;
b += i * 2;
为此:

Stack b;
int i;
while ((i = b.Peek()) > 0)
    b.Pop();
b.Push(i * 2);

看到区别了吗?当然,重写某些运算符并编写无人能读的代码更酷,但代码(至少是有用的代码)并不意味着酷。它是用来工作的,可重用的,可读的。等等,C++是一种非常危险的语言,它允许你做任何事情,让你逃脱它。如果你不小心你所做的,你可能会陷入麻烦,试图得到一些工作,如果你只是写它的其他方式更好。我去过那里。不要犯同样的错误。

既然其他人已经回答了这个问题(我想),我只想补充几句个人经验:

使用操作符重载很酷。使用模板类很酷。使用多态性很酷。然而,cooler并不能使代码变得更好;肖特也没有。之所以使用string.operator+而不是queue.operator+,是有原因的。运算符仅适用于您执行与运算符相关的操作时。向缓冲区添加内容不是其中之一。我给你举个例子。比较一下:

Stack b;
int i;
while ((i = --b) > 0)
    b--;
b += i * 2;
为此:

Stack b;
int i;
while ((i = b.Peek()) > 0)
    b.Pop();
b.Push(i * 2);

看到区别了吗?当然,重写某些运算符并编写无人能读的代码更酷,但代码(至少是有用的代码)并不意味着酷。它是用来工作的,可重用的,可读的。等等,C++是一种非常危险的语言,它允许你做任何事情,让你逃脱它。如果你不小心你所做的,你可能会陷入麻烦,试图得到一些工作,如果你只是写它的其他方式更好。我去过那里。不要犯同样的错误。

您可以使用函数模板。 像这样:

#include <iostream>
#include <string>

class MyBuffer
{
public:
  void AddToBuffer (const std::string& str) {
  }

  void AddToBuffer (const char* str) {
  }

  void AddToBuffer (int i) {
  }

  template<typename T>
  MyBuffer& operator+= (const T& str) {
    this->AddToBuffer (str);
    return (*this);
  }
};

int main (int argc, char *argv[])
{
  MyBuffer buffer;

  buffer += std::string("abcd");
  buffer += "abcd";
  buffer += 1;

  return(0);
}
#包括
#包括
类MyBuffer
{
公众:
void AddToBuffer(常量std::string和str){
}
void AddToBuffer(常量字符*str){
}
无效添加缓冲区(int i){
}
模板
MyBuffer和运算符+=(常量T和str){
此->添加缓冲区(str);
返回(*本条);
}
};
int main(int argc,char*argv[])
{
我的缓冲区;
缓冲区+=标准::字符串(“abcd”);
缓冲区+=“abcd”;
缓冲区+=1;
返回(0);
}

您可以使用函数模板。 像这样:

#include <iostream>
#include <string>

class MyBuffer
{
public:
  void AddToBuffer (const std::string& str) {
  }

  void AddToBuffer (const char* str) {
  }

  void AddToBuffer (int i) {
  }

  template<typename T>
  MyBuffer& operator+= (const T& str) {
    this->AddToBuffer (str);
    return (*this);
  }
};

int main (int argc, char *argv[])
{
  MyBuffer buffer;

  buffer += std::string("abcd");
  buffer += "abcd";
  buffer += 1;

  return(0);
}
#包括
#包括
类MyBuffer
{
公众:
void AddToBuffer(常量std::string和str){
}
void AddToBuffer(常量字符*str){
}
无效添加缓冲区(int i){
}
模板
MyBuffer和运算符+=(常量T和str){
此->添加缓冲区(str);
返回(*本条);
}
};
int main(int argc,char*argv[])
{
我的缓冲区;
缓冲区+=标准::字符串(“abcd”);
缓冲区+=“abcd”;
缓冲区+=1;
返回(0);
}