Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Как исправить ошибку?


Автор: rocky7 12.2.2009, 09:59
Почему ругается компилятор?
Код
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TMess msg;
TSignal sig;//TSignal производный класс от TMess
TDSB dsb;
for(int i=0;i<20;i++)
msg[i]=i;
 sig=dsb.Execute(msg);//---------------здесь компилятор выдает ошибку Could not find a match for 'T Signal::operator=(T Signal)
}

Ниже привожу функцию
Код
TSignal TDSB:: Execute(TMess& a)
{

    int siz = a.GetLen();
    TSignal local;
    for(int i=0;i<siz;i++)
     local[i]= a[i];
    return local ;


}


Модератор: Пользуйся кнопкой "Код"

Автор: andrew_121 12.2.2009, 10:09
rocky7, По ходу, у Signal не перегужен operator=(T Signal).
Смотри декларацию Signal.

Автор: rocky7 12.2.2009, 10:13
Вот так у меня описан TSignal
#ifndef tsignalH
#define tsignalH
#include "tmessage.h"

 class TSignal:virtual public TMess
{
  protected:
  int len;
  short *str;
  int CarrierFreq;
  public:
  TSignal() // стандартный конструктор
  { len=0;str=0;CarrierFreq=0; }
  TSignal(int,int);
  //TSignal(int n,const short* c,int f):TMess(n,c),CarrierFreq(f)
  //{n=0;c=0;f=0;}
  TSignal(int,const short*);
  ~TSignal()  // деструктор
  { delete[] str; }
  int& GetLen() { return len; }
  int& GetCarrierFreq() {return CarrierFreq;}
  short* GetStr() { return str; }
  TSignal& operator=(TSignal&);
  short& operator[](int);
};

Автор: Gluttton 12.2.2009, 10:32
Цитата

Ниже привожу функцию


Код

TSignal TDSB:: Execute(TMess& a)
{
    int siz = a.GetLen();
    TSignal local;
    for(int i=0;i<siz;i++)
    local[i]= a[i];
    return local ;
}


Ты создаешь переменную в функции local, которая в момент вызова функции будет расположена в стеке, по окончанию работы функции стек очиститься и у тебя вместо local функция будет возвращать какую-нибудь "арба-кадабру".

to xvr, zim22
*мне стыдно*

Автор: zim22 12.2.2009, 12:27
Цитата(Gluttton @  12.2.2009,  10:32 Найти цитируемый пост)
и у тебя вместо local функция будет возвращать какую-нибудь "арба-кадабру".

не согласен,что арба-кадабра будет возращена. 

Вот аналогичный код, в котором также создаётся автоматическая переменная, но значение из функции возвращается "нормальное"(копия x), а не мусор.
Код

int foo(const int &x)
{ 
   int z = x;
   return z;
}


В рез-те вызова:
Код

int res = foo(10); // res == 10;

Автор: xvr 12.2.2009, 12:29
Вот это
Код

class TSignal:virtual public TMess
{
  TSignal& operator=(TSignal&);
};
должно быть таким
Код

class TSignal:virtual public TMess
{
  TSignal& operator=(const TSignal&);
};
или таким
Код

class TSignal:virtual public TMess
{
  TSignal& operator=(TSignal);
};


2 Gluttton:
Цитата

Ты создаешь переменную в функции local, которая в момент вызова функции будет расположена в стеке, по окончанию работы функции стек очиститься и у тебя вместо local функция будет возвращать какую-нибудь "арба-кадабру".
не будет - у него возврат по значению, объект TSignal будет скопирован

Автор: rocky7 12.2.2009, 13:43
 Описал таким способом : 

TSignal& operator=(const TSignal&);

Всё заработало!!!

 smile  smile  smile 


xvr, - респект!!!

Буду дальше лопатить теорию. Учусь по книге Лафоре ООП на С++.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)