Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: С++ ооп.  (Прочитано 719 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн a10nan

  • Автор темы
  • Любитель
  • *
  • Сообщений: 78
  • Неофит
    • Просмотр профиля
С++ ооп.
« : 11 Декабря 2012, 23:06:02 »
Уважаемы форумчане помогите пожалуйста студенту.
Есть программа в которой определён некий класс, определёно для этого класса два конструктора, первый принимает три параметра, второй вообще не принимает параметров(что-то вроде параметров по умолчанию). Я сделал выбор, какой объект создавать, реализовал это через if...else, но столкнулся с проблемой ведь при создании объекта внутри этой конструкции программа вне её, не видит объекта, как сделать так чтоб программа видела этот объект?
Errare humanum est.

Asus S56CB-XO046H (Ubuntu 14.04)

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: С++ ооп.
« Ответ #1 : 12 Декабря 2012, 10:23:26 »
Объявить его вне if..else

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: С++ ооп.
« Ответ #2 : 12 Декабря 2012, 10:44:21 »
а вы покажите код и  растолкуйте что хотите сделать, тогда будет проще вам помочь

Поменяйте название темы на более информативное, иначе закрою тему.
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: С++ ооп.
« Ответ #3 : 12 Декабря 2012, 13:53:26 »
Проблема
Код: ("C") [Выделить]
class CObject {
    int a, b;
public:
    CObject(int A, int B) : a(A), b(B) {}
    CObject() : a(0), b(0) {}
    int sum() { return a + b; }
};

...

if (A && B) {
    CObject o(A, B);
} else {
    CObject o;
}
// Тут любая "o" вызодит из области видимости и объект мрёт смертью храбрых

Опустим нудные лекции о том что при нетривиальной логике или захватом иных ресурсов надо правильно реализовывать и конструктор с оператором копирования и деструктор.

Можешь сделать тупо
Код: ("C") [Выделить]

CObject o;
if (A && B) {
    CObject o1(A, B);
    o = o1;  // нужен оператор копирования
} else {
    // хм.. и правда тупо получилось
}


можешь сделать лучше

Код: ("C") [Выделить]

#include <memory>

std::unique_ptr<CObject> o;
if (A && B) {
    o.reset(new CObject(A, B));
} else {
    o.reset(new CObject());
}
if (!o) {
    std::cerr << "O_o WTF?!" << std::endl;
}
std::cout << "sum: " << o->sum() << std::endl;

// delete o; // не нужен! почему? оставлю в качестве "дом`ашки"

Пользователь решил продолжить мысль 12 Декабря 2012, 13:54:18:
Чистый,
Спокойно, тут и не такую феерическую ахинею спрашивали, и ничё, прокатывало.

Пользователь решил продолжить мысль 12 Декабря 2012, 13:55:45:
Да, извиняюсь, ключик -std=c++0x или -std=c++11 не забудьте компилятору подсунуть
« Последнее редактирование: 12 Декабря 2012, 13:55:45 от Yurror »

Оффлайн aSmile

  • Активист
  • *
  • Сообщений: 755
    • Просмотр профиля
Re: С++ ооп.
« Ответ #4 : 12 Декабря 2012, 14:47:03 »
Зачем так нагружать новичков? :)
Можно просто объявить как обычный указатель, а внутри if'а делать obj = new CObj(A,B);

Оффлайн Чистый

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 3473
  • nix - вот оно счастье...
    • Просмотр профиля
Re: С++ ооп.
« Ответ #5 : 12 Декабря 2012, 16:30:41 »
Чистый,
Спокойно, тут и не такую феерическую ахинею спрашивали, и ничё, прокатывало.
Значит будем стараться искоренять ахинею....
Тестовый репозиторий kdeNeur ppa:devcode/kdeneur
各々が死ぬことをどのように決定する

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.