Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2014, 18:12   #1
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию Присваивание С++

Код:
class Stack
{
private:
    myString *st;
        ....
        void operator=(myString);
class myString
{
private:
    char str[MAX_SIZE];
         ....

//реализация метода 
void Stack::operator=(myString a)
{
    st=a  //не работает 
}
Вот такая ситуация, типы данных разные, как присвоить ?

можно циклами, не обязательно присваиванием. Но нужно, чтобы работала такая запись. Не знаю как написать.

Код:
Stack z(2);
z[0]=z[1];
Praud вне форума Ответить с цитированием
Старый 10.03.2014, 18:32   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Код:
st=a  //не работает
А должен? Может это ";" Пропустили...
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 10.03.2014, 18:35   #3
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

да не, это я от руки написал. Дело в том, что в левой части находится указатель на строку (массив строк), а в левой обычная строка по сути.
Praud вне форума Ответить с цитированием
Старый 10.03.2014, 18:38   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

А компиль чё пишет, если не секрет?
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 10.03.2014, 18:39   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Вам нужно перегрузить оператор [] и определять оператор = для того типа, который хранится в стеке.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.03.2014, 18:51   #6
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Оператор[] у меня перегружен
Код:
myString Stack::operator[](int a)
{
	if(a<size)
		return st[a];
	else 
	{
		cerr<<"Error!";
		_getch();
		exit(-1);
	}
}
А вторую часть вашего предложения я не понял.
Praud вне форума Ответить с цитированием
Старый 10.03.2014, 19:23   #7
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
#include <iostream>
using namespace std;

class Stack {
	int a[10];
public:
    friend ostream& operator<< (ostream &f, const Stack &s) {
        for (int i = 0; i < 10; ++i)
            f << s.a[i] << " ";
        return f;
    }
    int& operator[] (int i) {
        return a[i];
    }
};

int
main()
{
    Stack p;
    for (int i = 0; i < 10; ++i)
        p[i] = i;
    cout << p;
}
Чтобы можно было присваивать значение, нужно возвращать ссылку.
Насчет второй части - нужно перегружать не оператор = у стека, а оператор = у строки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.03.2014, 19:35   #8
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

Первое исправил. А вот мои перегруженные операторы = для строки.

Код:
void myString::operator=(char *s)
{
	strcpy(str, s);
}

void myString::operator=(myString s)
{
	Addition(s);
}

void myString::Addition(myString s)
{
	int len=strlen(str);
	int i=0;
	int k=0;
	for(i=len;i<len+strlen(s.str);i++)
	{
		str[i]=s.str[k];
		k++;
	}

	str[i]='\0';
}
Praud вне форума Ответить с цитированием
Старый 10.03.2014, 21:14   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

То есть Вы не полностью поддерживаете все конструкции с++ (например, a = b = c; )?
Код:
myString& operator=(const myString& s)
{
    int len = strlen(str);
    strcpy(str + len + 1, s.str + 1);
    str[len] = s.str[0];//надеюсь, что такая конструкция позволит избежать ошибок при случае присваивания a = a;
    return *this;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 10.03.2014, 23:57   #10
Praud
Форумчанин
 
Аватар для Praud
 
Регистрация: 11.10.2012
Сообщений: 409
По умолчанию

При присваивании st=a пишет "Невозможно преобразовать из myString* в myString.

А насчет конструкций, не существенно, но для себя хотелось бы узнать в чем разница и как это записать? Я думал эта конструкция будет поддерживаться.
Praud вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Присваивание ячеек Gayverock2027 Microsoft Office Excel 4 21.11.2012 13:20
Присваивание BastAngel Компоненты Delphi 2 01.02.2012 14:35
Массовое присваивание Zhenya-Pvl Общие вопросы C/C++ 6 26.02.2011 17:51
Присваивание объектов Stalevar Общие вопросы Delphi 0 17.02.2009 19:06
динамическое присваивание параметров The Doberman БД в Delphi 0 14.09.2007 07:58