如何在抽象类的成员函数中使用/转换对“this”的引用?

Posted

技术标签:

【中文标题】如何在抽象类的成员函数中使用/转换对“this”的引用?【英文标题】:How to use/cast a reference to "this" in an abstract class' member function? 【发布时间】:2016-04-08 18:53:57 【问题描述】:

以下代码效果很好...

 class Printable  public:
   virtual size_t printTo(Print& p) const = 0;
 ;

class Printer : public Printable  public:

  size_t printTo(Print& p) const 
   return p.print("I am a printer");
  
;

Printer pp;

void loop()  Serial.println(pp); 

I am a printer ....

但是,如果我尝试在 Printer.. 的公共成员函数中使用这个新发现的可打印性。

void print()  Serial.println(this); 

砖头...

 error: call of overloaded 'println(Printer* const)' is ambiguous
note: candidates are:
  size_t Print::println(char) <near match>
  note:   no known conversion for argument 1 from 'Printer* const' to 'char'
  size_t Print::println(unsigned char, int) <near match>
  note:   no known conversion for argument 1 from 'Printer* const' to 'unsigned char'
  size_t Print::println(int, int) <near match>
  note:   no known conversion for argument 1 from 'Printer* const' to 'int'

等等等等...但是为什么编译器没有找到“候选”(在同一个Print 标头中,其中Serial 是其子类)...

size_t println(const Printable&);

甚至

size_t println(void);

我已经尝试了所有我能唤起的this 演员,没有任何魔法。用this 调用抽象类函数是不是根本不可能?

对于所有吵着要compilable example... here you are的人。

【问题讨论】:

println的定义在哪里?请提供真实的 MCVE。 “用this 调用抽象类函数是不可能的吗?” 不,完全有可能。请添加一个minimal reproducible example,表明您实际上不能。 编译器似乎在明确表示您没有声明任何将指向 Printer 的指针作为参数的 println 重载。 您已经有足够长的时间来了解发布 MCVE 的重要性。我们甚至不必问。 代码 is "MCVE", IF 你已经安装了Arduino 工具链......因此标记。 【参考方案1】:

既然你表示了

void loop()  Serial.println(pp); 

有效,我将冒险猜测您需要:

void print()  Serial.println(*this); 
                           // ^^ Need * before "this"

this 是指向当前对象的指针。 *this 是它指向的对象。

【讨论】:

我认为你是对的...在我急于创建一个“可接受的”代码示例...我尝试使用 just 这样的指针,然后 !让我仔细检查一下实际的 Arduino 环境。但我认为你是在赚钱。 :-)

以上是关于如何在抽象类的成员函数中使用/转换对“this”的引用?的主要内容,如果未能解决你的问题,请参考以下文章

C#中基类属性值在子类中设置,如何在基类的方法中获取子类设置的值?

This关键字

如何在不向下转换的情况下调用派生类的成员函数

类函数、成员函数、静态函数、抽象函数、方法伪装属性

如何根据派生类的this指针找到成员函数?

类与对象