2013-08-18 33 views
0

我想允许在类的构造方法链接,我已经遇到了同样的问题,在这个C++ method chaining including class constructor,我已经尝试了建议的答案,但仍然得到同样的错误。我的代码如下: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(); 

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

希望有人能帮助:)

UPDATE:

我把 “强调()” 内为 “WAV” 一类的成员,它的工作,我怎么想。但是,有没有人知道我可以在“Signal”中访问这个成员的方式,而不必将类成员放在“Wav”中?

UPDATE:

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

提示:'new' expre ssion返回一个指针。 – jrok

+0

对于我想要达到的目标,[Named Parameter Idiom](http://www.parashift.com/c++-faq/named-parameter-idiom.html)可能更适合。 – jrok

+0

所以你自己回答了这个问题,导致更新中的解决方案就是我会提出的。问题是你不能做堆和堆栈分配的方法链。 –

回答

2

new表达式返回一个指针,所以你只需要做:

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

而且你的方法Emphasize返回的信号对象的引用:

Signal& Emphasize() { 
// ^Reference 
    return *this; 
} 

但是,您正试图将此引用分配给pointe r Wav*

你有两个选择:

// ... 
Signal* Emphasize() { 
    return this; 
} 

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

或者你让你initiale 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; 
} 

OR

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

他还需要更改Emphasize()来返回一个指针吗? – GreatBigBore

+0

@Pierre Fourgeaud出现以下错误:'error:expected';'声明结束 Wav * wave = new Wav(“asf”,DOUBLE) - > Emphasize();' – Phorce

+0

@Phorce我更新了我的答案。另一个问题:你是否正确地在你正在做的文件中包含类定义:'Wav * wave = new Wav(“asf”,DOUBLE) - > Emphasize();'? –

2

你在找这样的事吗?

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

或者,如果你想要的Wav对象在最后,你可以定义强调()几乎在信号类

virtual Signal& Emphasize()=0; 

然后在的Wav类,你可以定义

Wav& Emphasize(){ 

    return *this; 
} 

在主要你可以拨打

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

感谢您的答复。但是,不,我正在考虑允许方法链接。 – Phorce

+0

好的,你的问题是Emphasize返回指向Signal对象的指针,也许这样做实际上可以帮助你。 – gokhans