0

我正在尝试允许构造函数上的方法链接,我在这个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();

我不知道实际过程是否可行,因为“强调”它不是构造函数,但希望我可以访问它。我在这里做错了什么,这不起作用?

希望有人可以提供帮助:)

更新:

我将“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();
 }
4

2 回答 2

2

Are you looking for something like this?

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

Or if you want Wav object at the end, you can define Emphasize() virtually at Signal class

virtual Signal& Emphasize()=0;   

Then at Wav class you can define

Wav& Emphasize(){

    return *this;
}

In the main you can call

Wav* wave = new Wav("asf", DOUBLE);
Wav w = wave->Emphasize();
于 2013-08-18T19:17:44.810 回答
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();
于 2013-08-18T19:14:48.033 回答