构造函数上的C++方法链接

C++ Method chaining on constructor

本文关键字:方法 链接 C++ 构造函数      更新时间:2023-10-16

我正在尝试允许构造函数上的方法链接,我在这个C++方法链接(包括类构造函数)上遇到了同样的问题,我尝试了建议的答案,但仍然得到了同样的错误。我的代码如下:

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();

我不知道实际的过程是否可能,因为"强调"它不是一个构造函数,但希望我能被允许访问它。如果不起作用,我会做错什么?

希望有人能帮忙:)

更新:

我把"强调()"作为一个类成员放在"Wav"中,它按照我的意愿工作。但是有人知道一种方法吗?我可以在"Signal"中访问该成员,而不必将该类成员放置在"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();
 }

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对象。

没有从SignalWav对象的转换。

Wav是信号,但信号不是Wav

你可以做一些类似的事情:

在您的Signal类内部:

virtual Signal& Emphasize()=0;

在您的Wav类中:

Wav& Emphasize()
{
     return *this;
}

Signal w = new Wav( "asf", DOUBLE )->Emphasize();

你在找这样的东西吗?

Wav* wave = new Wav("asf", DOUBLE);
Signal x = wave->Emphasize();

或者,如果你想在最后使用Wav对象,你可以在Signal类中虚拟地定义强调()

virtual Signal& Emphasize()=0;   

然后在Wav类中,您可以定义

Wav& Emphasize(){
    return *this;
}

总的来说,你可以打电话给

Wav* wave = new Wav("asf", DOUBLE);
Wav w = wave->Emphasize();