C ++方法链接构造函数

时间:2013-08-18 19:09:50

标签: c++ method-chaining

我正在尝试允许在构造函数上进行方法链接,并且我在此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();
 }

2 个答案:

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

SignalWav对象没有转换。

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