2013-08-18 5 views
0

Я пытаюсь разрешить цепочку методов в конструкторе, и я столкнулся с той же проблемой на этом C++ method chaining including class constructor, и я попробовал предложенные ответы, но все еще получаю ту же ошибку. Мой код ниже:C++ Метод chaining на конструкторе

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", и она работала, как я хотел. НО кто-нибудь знает, как я могу получить доступ к этому члену внутри «Сигнала», не помещая член класса внутри «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

Для чего (я думаю), вы пытаетесь достичь, [Именованный параметр Idiom] (http://www.parashift.com/c++-faq/named-parameter-idiom.html) может быть лучше подходит. – jrok

+0

Итак, вы сами ответили на это, потому что решение в обновлении - это то, что я бы предложил. Проблема заключается в том, что вы не можете выполнять цепочку методов, которая работает для распределения кучи и стека. –

ответ

2

Выражение new возвращает указатель, так что вы просто должны сделать:

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

Кроме того, ваш метод Emphasize возвращает ссылку на объект Signal:

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

Но вы пытаетесь присвоить эту ссылку пуанту 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(); 

EDIT: Ok реальная ошибка в том, что вы пытаетесь конвертировать объект Signal в объект Wav.

Нет конвертации из Signal в Wav объект.

Wav - это сигнал, но сигнал не является Wav.

Вы можете сделать что-то вроде:

Внутри вашего Signal класса:

virtual Signal& Emphasize()=0; 

И внутри вашего Wav класса:

Wav& Emphasize() 
{ 
    return *this; 
} 

ИЛИ

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