我正在尝试允许在构造函数上进行方法链接,并且我在此C++ method chaining including class constructor上遇到了同样的问题,我尝试了建议的答案,但仍然得到相同的错误。我的代码如下:
class Signal {
public:
Signal() { }
Signal& Emphasize() {
return *this;
}
};
enum ReadType { NATIVE = 0, DOUBLE, };
class Wav : public Signal {
public:
Wav(string fileName, ReadType type) {
}
};
我尝试过以下电话:
Wav* wave = new Wav("asf", DOUBLE).Emphasize();
和
Wav wave = Wav("asf", DOUBLE).Emphasize();
我不知道实际过程是否可行,因为“强调”它不是构造函数,但希望我可以访问它。我不能在这里做错,因为这不起作用?
希望有人可以帮忙:)
更新:
我把“Emphasize()”作为“Wav”里面的一个班级成员,它有用,我想要的。但有没有人知道我可以在“信号”中访问这个成员的方式,而不必将类成员放在“Wav”中?
更新:
class Signal {
public:
Signal() { }
Signal* Emphasize() {
return this;
}
};
enum ReadType {
NATIVE = 0, DOUBLE,
};
class Wav : public Signal {
public:
Wav(string fileName, ReadType type) {
}
};
int main(int argc, char *argv[]) {
Wav* wave = new Wav("asf", DOUBLE)->Emphasize();
}
答案 0 :(得分:2)
new
表达式返回一个指针,您只需执行:
Wav* wave = new Wav("asf", DOUBLE)->Emphasize();
// ^^
此外,您的方法Emphasize
会返回Signal对象的引用:
Signal& Emphasize() {
// ^ Reference
return *this;
}
但是您尝试将此引用分配给指针Wav*
。
你有两个选择:
// ...
Signal* Emphasize() {
return this;
}
// ...
Wav* wave = new Wav("asf", DOUBLE)->Emphasize();
或者你保持初始Emphasize
方法:
// ...
Signal& Emphasize() {
return *this;
}
// ...
Wav wave = new Wav("asf", DOUBLE)->Emphasize();
编辑:
好吧,真正的错误是你试图将Signal
对象转换为Wav
对象。
从Signal
到Wav
对象没有转换。
Wav是一个信号,但信号不是Wav。
您可以执行以下操作:
在Signal
课程内:
virtual Signal& Emphasize()=0;
在Wav
课程内:
Wav& Emphasize()
{
return *this;
}
或强>
Signal w = new Wav( "asf", DOUBLE )->Emphasize();
答案 1 :(得分:2)
你在找这样的东西吗?
Wav* wave = new Wav("asf", DOUBLE);
Signal x = wave->Emphasize();
或者如果你想在最后使用Wav对象,你可以在Signal类中虚拟定义Emphasize()
virtual Signal& Emphasize()=0;
然后在Wav课程中你可以定义
Wav& Emphasize(){
return *this;
}
在主要部分,您可以致电
Wav* wave = new Wav("asf", DOUBLE);
Wav w = wave->Emphasize();