Форум программистов, компьютерный форум CyberForum.ru

Переопределение операции присваивания - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как реализовать флаги в параметрах функции http://www.cyberforum.ru/cpp-beginners/thread1235623.html
Объясните пожалуйста как реализовать флаги в параметрах функции. К примеру: есть такие флаги left middle right drowPoints (тут параметры флаги); Вот так я эти флаги прописываю
C++ Исправить ошибку "undefined reference" Компилирую в Ubuntu 14.04 Code::Block Есть 3 файла. klass.h initial.cpp main.cpp klass.h #include <iostream> #include <cstring> using namespace std; class Book http://www.cyberforum.ru/cpp-beginners/thread1235621.html
C++ Убрать привязку к конкретной директории. GetCurrentDirectory
Привет, всем! Новая проблемка, имеется следующее: D3DXCreateTextureFromFileEx(pDirect3DDevice, "C:/Users/Anton/Documents/Visual Studio 2010/Projects/MyProgectSprite/OpeningScreen.bmp", D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT, D3DX_DEFAULT, D3DCOLOR_ARGB(255,255,255,255), NULL, NULL, &openingTexture); Мне не нравится строка...
Программа ввода и проверки пароля C++
Я хочу написать программу запрашивающая пароль пока тот не станет верным написал прогоамма работало но даже если пароль был не верен просто выводила другую строку добавил цикл программа не работает вот код #include <iostream.h> #include <stdio.h> #include <locale> using namespace std; int hacerAlert () { string answer;
C++ Игра крестики нолики http://www.cyberforum.ru/cpp-beginners/thread1235549.html
#include <iostream> using namespace std; int main () { int a,k=0,c; char mas; while(k<10) {
C++ Вывод числа в столбик с первой цифры, без массива, без строк #include <iostream> #include <math.h> using namespace std; void p(long a) { long i=0,z=a; while (z) { z/=10; i++; //êîëè÷åñòâî öèôð âî ââåäåííîì ÷èñëå подробнее

Показать сообщение отдельно
dalay_lama
 Аватар для dalay_lama
65 / 65 / 7
Регистрация: 22.09.2012
Сообщений: 435
29.07.2014, 09:51     Переопределение операции присваивания
Цитата Сообщение от Gwini Посмотреть сообщение
Я ж спрашиваю, разве если формальный параметр ссылка на базовый класс, то при передаче ссылки на производный класс функция будет использовать экземпляр базового калсса, урезая даные-члены производного класса?
ну так а откуда он возьмёт те свойства, которых у него в помине не существует?.
Код
Базовый_класс
{
   свойство 1;
}
Производный_класс
{
   свойство_2;
}
Базовый_класс v;//у него есть свойство 1, допустим в конструкторе оно приняло какое-то значение
(Производный_класс)v;//свойство_1 осталось тем-же, своство_2 - ?????
короче, нельзя так делать - фу-фу-фу.

если честно, я не помню, как досконально происходит приведение типа поэтому не могу ответить на твой вопрос по поводу того, какое присвоение будет вызвано, домой приду, сам ещё разбираться буду) Но факт в том, что у полученого объекта, который ты приводишь к типу производного класса просто не будет свойства, которое ты пытаешься скопировать и получить его длину strlen;
Попробуй сейчас оставить только присвоение вида Classic& Classic::operator=(Cd &cd);
только не делай этого в методе - Classic temp = (Classic &)cd а просто дай нулевой указатель свойству main_cmpc, проверь, будет ли ошибка

Добавлено через 6 минут
тьфу ты)
само собой у тебя будет вызываться сначала оператор присваивания базового класса. Тебе же сначала нужно задать значения для свойств базового класса, так? для этого вызываем оператор присваивания БАЗОВОГО класса Cd::operator=(argument) - у тебя были эти строки, я помню

Добавлено через 2 минуты
C++
1
2
3
4
5
6
7
8
9
10
Classic& Classic::operator=(const Cd& c)
{
    if (this == &c)
        return *this;
    Classic temp = (const Classic&)c;
    Cd::operator=(c);//вот же твой вызов оператора базового класса
    main_cmps = new char[strlen(temp.main_cmps) + 1];
    strcpy(main_cmps, temp.main_cmps);
    return *this;
}
короче, вот так надо:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Classic& Classic::operator=(const Cd& c)
{
    if (this == &c)
        return *this;
    Cd::operator=(c);
    delete [] main_cmps;
    main_cmps = nullptr;
    return *this;
}
Classic& Classic::operator=(const Сlassic& c)
{
    if (this == &c)
        return *this;
    Cd::operator=(c);
    delete [] main_cmps;
    main_cmps = new char[ strlen(c.main_cmps) + 1 ];
    strcpy(main_cmps, c.main_cmps);
    return *this;
}
 
Текущее время: 19:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru