如何在抽象类的成员函数中使用/转换对“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”的引用?的主要内容,如果未能解决你的问题,请参考以下文章