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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2010, 13:13   #1
fmx999
Новичок
Джуниор
 
Регистрация: 01.04.2010
Сообщений: 2
По умолчанию Наложения объектов в C++

Всем известна рекомендация передавать в функцию/метод в качестве параметра не объект, а const reference на него, в случае, если объект может быть достаточно большой.

В таком случае возникает вопрос: какие приемы позволяют обезопасится от ситуаций, когда в качестве параметра методу передается ссылка на часть этого самого объекта.

Пример:
Код:
#include <iostream>
using namespace std;
class A {
public:
    A(): a(0), b(0) { }

    void init(const int& _a, const int& _b) {
        a = _a;
        b = _b;
    }

    void replace() {
        init(b, a);
    }

    void print() {
        cout << "(" << a << ", " << b << ")" << endl;
    }

private:
    int a;
    int b;
};

int main(void)
{
    A x;

    x.init(1, 2);
    x.replace();
    x.print();

    return 0;
}
Ожидаемое поведение здесь - объект X должен стать парой (2, 1).
В действительности, из-за "наложения" *this и _b в методе A::init
результатом будет пара (2, 2).

Ясно, что это достаточно надуманный пример, но все же здесь ясна проблема. Как Вы избегаете таких ситуаций при разработке кода?
fmx999 вне форума Ответить с цитированием
Старый 01.04.2010, 13:40   #2
Kostia
Участник клуба
 
Аватар для Kostia
 
Регистрация: 21.11.2007
Сообщений: 1,690
По умолчанию

void init(const int& _a, const int& _b) {
сцылко ф топку и фсе хоккей
Kostia вне форума Ответить с цитированием
Старый 01.04.2010, 14:29   #3
fmx999
Новичок
Джуниор
 
Регистрация: 01.04.2010
Сообщений: 2
По умолчанию

В данном конкретном примере понятно, что надо делать.
Хотелось бы получить какие-то правила программирования, которые гарантируют безопасность использования ссылок на объекты, а с другой стороны - не накладывают слишком жестких ограничений на программу.

К примеру, если отказаться от использования передачи параметров по ссылке вообще, то это приведет к появлению лишних операций копирования объектов, что нежелательно.
fmx999 вне форума Ответить с цитированием
Старый 01.04.2010, 17:39   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

а очень просто. следить за вызовом из класса public методов. по хорошему, не вызывать эти методы из класса, а оставить их для интерфейса
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив объектов _bAd_ Помощь студентам 10 20.01.2010 08:33
Вставка объектов KinderX Microsoft Office Excel 5 22.09.2009 05:13
''Слои'' наложения изображений. Alex Cones Мультимедиа в Delphi 3 11.04.2009 17:03
Перетаскивание объектов Rusl92 Общие вопросы Delphi 4 04.11.2008 12:04
Наложения изображения друг на друга rudakop HTML и CSS 1 16.09.2008 03:03