【问题标题】:C++ inheritance of preincrement operator预增量运算符的 C++ 继承
【发布时间】:2015-10-20 15:43:15
【问题描述】:

我有以下两个类:

     class MyClass
     {
       friend ostream& operator<<(ostream&, const MyClass& );   
       friend int operator+(const MyClass &, const MyClass &);
       public:
         MyClass(const int );
         MyClass(const int, const int);
         MyClass (const MyClass *,  const MyClass *);
         ~MyClass();
         MyClass& operator++();        
         void printValue();
         void setValue(int);           
         int  getValue() const;
       private:
         int value;     
     };


   class DevClass : public MyClass
   {
     public: 
       DevClass(const int, const char *s); 
       char getId() const;
       void setId(char *s);           

   private:
       char id; 
   };

operator++的实现如下:

 MyClass& MyClass::operator++() 
  {
   this->value +=1;
   return *this;
  } 

现在,如果我将运算符与派生类一起使用:

 DevClass *dev=new DevClass(10,'c');
 ++dev;

“dev”似乎指向内存中的其他地方。为什么 ?为什么朋友运算符不被继承?这是一个课堂练习,所以我需要解决这个问题。
谢谢!。

【问题讨论】:

  • DevClass dev = new DevClass(10, 'c'):你为什么在这里使用new?你为什么使用new 而不是将结果分配给指针(即DevClass*
  • 这是一个课堂练习约束。
  • DevClass dev=new DevClass(10,'c'); 应该是编译器错误,因为您试图将指针分配给非指针。
  • 复制粘贴错误,代码已打补丁。
  • @Pandemia000 正如其他人所提到的,由于dev 是一个指针(即DevClass*),您需要取消引用它才能使用增量成员函数++(*dev)

标签: c++


【解决方案1】:

devDevClass * 类型,它是一个指针,而不是你的类。你是说++(*dev)吗?

【讨论】:

    【解决方案2】:

    在声明 ++dev; 中,您不是在 dev 指向的对象上调用 operator++ - 您是在 dev 本身上调用它,它是一个指针,并且通过递增它您正在制作它指向可能无效的东西。要在 DevClass 实例上调用 operator++,您可以使用:

    ++(*dev);
    

    【讨论】:

    • 所以,问题出在运算符 *.谢谢!
    【解决方案3】:
    DevClass dev=new DevClass(10,'c');
     ++dev;
    

    不是合法代码。您的编译器应将其报告为错误。

    如果你使用:

    DevClass* dev=new DevClass(10,'c');
     ++dev; // Incrementing the pointer, not the object.
    

    dev 指向不同的位置是有道理的,尽管这是导致未定义行为的原因,因为dev 仅指向一个对象。

    如果你使用:

    DevClass dev = DevClass(10,'c');
     ++dev; // Incrementing the object
    

    dev 在调用operator++() 之前和之后是同一个对象。

    猜你喜欢
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2019-09-25
    • 2017-07-13
    相关资源
    最近更新 更多