crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Перегрузка конструктора, Передаются одинаковые типы, но разные по сути значения
QMainWindow
  опции профиля:
сообщение 16.3.2012, 9:53
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет всем!
Столкнулся с такой проблемой: есть два конструктора класса
Plot2D(int topMargin, int rightMargin, int bottomMargin, int leftMargin, QPaintDevice *paintDevice);
Plot2D(int x, int y, int width, int height, QPaintDevice *paintDevice);
Видно, что в обоих передаваемые типы одинаковы, но по сути это совершенно разные переменные. Компилятор не пожет перегрузить мой конструктор. Как обычно выходят из подобных ситуаций? Добавить какие-то "отличительные" признаки не могу, т.к. они попросту не нужны.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ilyabvt
  опции профиля:
сообщение 16.3.2012, 10:28
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 297
Регистрация: 23.6.2011
Пользователь №: 2765

Спасибо сказали: 45 раз(а)




Репутация:   3  


Цитата
Как обычно выходят из подобных ситуаций?

Меняют объявления конструкторов. Иначе никак.
Цитата
Компилятор не пожет перегрузить мой конструктор.

Я его прекрасно понимаю.
Вот объявление переменной:
Plot2D x(1, 2, 3, 4, image);

Угадайте какой конструктор я использовал?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.3.2012, 10:35
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


class Plot2D
{
    public:
    struct s_margins
    {
        int top___Margin;
        int right_Margin;
        int bottomMargin;
        int left__Margin

        s_margins()
        {
            *this=s_margins(0,0,0,0);
        }

        s_margins
        (
             int top___Margin
            ,int right_Margin
            ,int bottomMargin
            ,int left__Margin
        )
        :top___Margin(top___Margin)
        ,right_Margin(right_Margin)
        ,bottomMargin(bottomMargin)
        ,left__Margin(left__Margin)
        {
        }
    };

    struct s_placements
    {
        int x;
        int x;
        int w;
        int h

        s_placements()
        {
            *this=s_placements(0,0,0,0);
        }

        s_placements
        (
             int x
            ,int y
            ,int w
            ,int h
        )
        :x(x)
        ,y(y)
        ,w(w)
        ,h(h)
        {
        }
    };


    Plot2D(const s_margins& M, QPaintDevice *paintDevice);
    Plot2D(const s_placements& P, QPaintDevice *paintDevice);
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 16.3.2012, 11:19
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ясно. Или QPaintDevice *paintDevice помять местами в одном...)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.3.2012, 11:28
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


QMainWindow, лучше сразу правильно делать )))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.3.2012, 14:00
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 16.3.2012, 11:28) *
QMainWindow, лучше сразу правильно делать )))

Перед созданием заполнять структуру? Тяжелое наследие виндовс АПИ? ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.3.2012, 14:15
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


BRE, апи тут ни при чём. Это во-первых. Во вторых, гораздо быстрее передать один указатель. В-третьих - удобнее, читабельнее и проще модифицировать, когда понадобится добавить ещё переменную :)

а в данном случае это вообще единственный выход

А вызов делать не сложнее:

было
F(x,y,z)

стало
F(s(x,y,z))

Сообщение отредактировал Алексей1153 - 16.3.2012, 14:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 16.3.2012, 14:33
Сообщение #8


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


Алексей1153, только вот тут лучше бы иначе:
  struct s_placements
    {
        // ..............
        s_placements()
        :x(0)
        ,y(0)
        ,w(0)
        ,h(0)
        {
        }

    };
или использовать делегирующий конструктор, если компилятор поддерживает C++11:
    struct s_placements
    {

        s_placements() : s_placements(0,0,0,0)
        {
        }

    };
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 16.3.2012, 14:50
Сообщение #9


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


Влад, да, поленился )

а вот это
Цитата
s_placements() : s_placements(0,0,0,0)

не приветствую!

Сообщение отредактировал Алексей1153 - 16.3.2012, 16:16
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 16.3.2012, 17:41
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Алексей1153 @ 16.3.2012, 14:15) *
апи тут ни при чём. Это во-первых.

А что причем? :) Да, язык C++ не может иметь разные конструкторы с одинаковыми сигнатурами, но это же совсем не повод для таких решений.

Цитата(Алексей1153 @ 16.3.2012, 14:15) *
Во вторых, гораздо быстрее передать один указатель.

А время заполнения структуры ты считаешь? А почему?

Цитата(Алексей1153 @ 16.3.2012, 14:15) *
В-третьих - удобнее, читабельнее и проще модифицировать, когда понадобится добавить ещё переменную :)

Читабелнее? Тоже спорно.
F(s(x,y,z))

Читающему код придется разбираться, а что это за s такой? Объект это или функция, что-то возвращающая.

По мне, так вводить отдельную сущность на каждый чих это перебор. Если эту структуру можно выделить в отдельный класс - выделяй, но делать это для передачи параметров... это в лучших традициях "специалистов" микрософта.

Сообщение отредактировал BRE - 16.3.2012, 19:02
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.4.2024, 0:12