如何编写赋值=运算符

时间:2012-06-08 13:51:24

标签: c++ assignment-operator

在Abc.hpp文件中定义了以下信息:

class Abc: public A
{
 enum Ac { VAR };

   struct L{
      std::string s1;
      ::Class2::ID type;
      unsigned s;
      bool operator==(const L& l) const { return (type==l.type)&&(s==l.s)&&(s==l.s); }
   };

   class SS
   {
      public:
      virtual ~SS();
   };
   class IS {
      public:
      /// Destructor
      virtual ~IS();

   };

   class HashIndexImplementation;
   class HashIndex;

 void func(){}

  Abc& operator=(Abc&) {
    cout << "A::operator=(A&)" << endl;
    return *this;
  } //It gives me the error that the token '{' is not recognized

 Abc(Class2 & part);
};

上述课程旨在为我的目的分配另一课程以下信息:

Abc d;
static Abc f;
f=d;

但是,我上面写的代码不起作用......它抛出的错误是:

 no matching function for call to Abc::Abc()
编辑:我正在处理整个类的层次结构因此,如果我添加另一个像Abc()这样的构造函数,那么我被迫在多达20个类中进行更改...是否有其他方法可以使用作业。 是否有一些方法可以合并其他构造函数。

3 个答案:

答案 0 :(得分:3)

no matching function for call to Abc::Abc()

如果要将类对象实例化为:

,则需要提供一个不带参数的构造函数。
Abc d;

这是因为如果您提供自己的 任何 构造函数,编译器不会生成默认的无参数构造函数。您提供了自己的复制构造函数,因此编译器强制您提供自己的无参数构造函数。

答案 1 :(得分:0)

在课程Abc的结束括号后面没有分号。尝试添加分号,它应该解决问题。

答案 2 :(得分:0)

在删除所有不相关的内容并生成short self-contained compilable example之后(请在以后的问题中自行完成),我想出了这个:

#include <iostream>
#include <iomanip>
#include <map>
#include <string>
using namespace std;
class Abc
{
 enum Ac { VAR };

  Abc& operator=(Abc&) {
    cout << "A::operator=(A&)" << endl;
    return *this;
  } //It gives me the error that the token '{' is not recognized

};

int main()
{
    Abc abc;
}

这编译,但并没有真正做太多。您对入站Abc引用不做任何操作。就语言语法而言,技术上是正确的,它没有任何有用的工作。通常,您将按照以下方式执行某些操作:

class Abc
{
  int foo_;
  Abc& operator=(Abc& rhs) {
    cout << "A::operator=(A&)" << endl;

  foo_ = rhs.foo_;

    return *this;
  } //It gives me the error that the token '{' is not recognized
};

除此之外,你的语法错误现在已经消失了。有许多未定义的内容,例如Abc的基类,B::class2。也许你需要#include来引入这些定义。