Russian Qt Forum
Мая 25, 2025, 00:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Не получается подружиться с QVector  (Прочитано 28616 раз)
dr_Begemot
Гость
« Ответ #30 : Июля 10, 2009, 09:59 »

Код
C++ (Qt)
class CMain : public QObject
{
 Q_OBJECT
public:
     CMain(QObject *parent=0)
         : QObject(parent)
     {}
 
void test(){
if(!list.empty())
A *val = list[0];
}
 
     ~CMain() {}
 
private:
 QVector<A *> list;
};

ну так это с указателем...
QVector<A *> list;

Это как бы не совсем решение, т.е. конечно решение, но уже с изменением условий самой задачи...
Меня то интересует решение как раз когда QVector<A> list; если таковое есть...
Записан
dr_Begemot
Гость
« Ответ #31 : Июля 10, 2009, 10:00 »

Извиняюсь за тупость но я так и не понял решения... Грустный
вы имеете ввиду оператор присваивания? Как его написать для данного случая?

еще раз извиняюсь)

Честно говоря, когда игнорируют развернутые ответы дальнейшее желание писать пропадает, но на этот раз отвечую: "добавить * между A и >"


Интересует решение без добавления * между А и >... Как бы так...
Тут кто-то говорил про то что нужно особый конструктор написать, вот какой и где, вот что интересует
Записан
f-r-o-s-t
Гость
« Ответ #32 : Июля 10, 2009, 10:08 »

Ну хочешь так твое дело, просто объяви и определи конструктор копирования в классе B
B(const B &other);
Записан
dr_Begemot
Гость
« Ответ #33 : Июля 10, 2009, 10:23 »

Ну хочешь так твое дело, просто объяви и определи конструктор копирования в классе B
B(const B &other);


Правильно я понимаю что это будет выглядеть так:
Код:
class B : public QObject
{
  Q_OBJECT
public:
    B(QObject *parent=0)
        : QObject(parent)
    {}
    B(const B &other) : val1(other.val1), val2(other.val2){}
 
    ~B() {}
    int val1;
    double val2;
};

В данной записи смущает что полей класса может быть дофига, и что все так прописывать? Если ничего не поделаешь, то ладно, но ведь вроде бы если рассматривать обычные классы, то когда экземпляры класса приравниваются происходит копирование полей?
Записан
f-r-o-s-t
Гость
« Ответ #34 : Июля 10, 2009, 10:35 »

Это конструктор копирования, он описывает как создать один объект на основе другого,
как бы вы писали оператор присваивания? ведь тоже пришлось определять все поля.
Копирование полей происходит по умолчанию, но бывает что это не самый лучший вариант.
Вообщем долго можно рассказывать, есть еще вопросы ?
Записан
dr_Begemot
Гость
« Ответ #35 : Июля 10, 2009, 10:44 »

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

Сделал так:
Код:
class B : public QObject
{
  Q_OBJECT
public:
    B(QObject *parent=0)
        : QObject(parent)
    {}
    B(B&)
    {}
 
    ~B() {}
};
 
class A
{
public:
    A() {}
    A(A&a) : val1(a.val1), val2(a.val2){}
    ~A() {}


    B val1;
    B val2;
};
class CMain : public QObject
{
    Q_OBJECT
public:
    CMain(QObject *parent=0) : QObject(parent) {}

    void test(){
if(!list.empty())
        A val = list[0];
    }

    void append(A val){
list.append(val);
    }
 
    ~CMain() {}
 
private:
    QVector<A> list;
};

Так вот после того как я добавил ф-ю append(A val) в класс CMain вылезла ошибка: error C2558: class 'A' : no copy constructor available or copy constructor is declared 'explicit'
while compiling class template member function 'void QVector<T>::append(const T &)'

Как ее исправить?
Записан
denka
Гость
« Ответ #36 : Июля 10, 2009, 11:07 »

Блин ну ведь на двух придыдущих страницах разжевывали несколько раз уже. Классы от QObject не копируется!!! Не ужели не понятно? А ты что делаешь?
Код:
    A(A&a) : val1(a.val1), val2(a.val2){}
Используй указатель на объект
Записан
dr_Begemot
Гость
« Ответ #37 : Июля 10, 2009, 11:16 »

Блин ну ведь на двух придыдущих страницах разжевывали несколько раз уже. Классы от QObject не копируется!!! Не ужели не понятно? А ты что делаешь?
Код:
    A(A&a) : val1(a.val1), val2(a.val2){}
Используй указатель на объект

Там писали что нужно использовать копирующий конструктор, я вроде как его и сделал:
B(B&){}, так что мешает его вызвать?
Про указатель уже писал выше, что не желательно.
Записан
spectre71
Гость
« Ответ #38 : Июля 10, 2009, 11:27 »

Код
C++ (Qt)
class B : public QObject
{
 Q_OBJECT
public:
   B(QObject *parent=0)
       : QObject(parent)
   {}
   explicit B(const B &b)
   {}
 
   ~B() {}
   inline B& operator  = (const B &b)  {return *this;}
};
 
class A
{
public:
   A() {}
   A(const A& a) {val1 = a.val1; val2 = a.val2;}
   ~A() {}
 
 
   B val1;
   B val2;
};
class CMain : public QObject
{
   Q_OBJECT
public:
   CMain(QObject *parent=0) : QObject(parent) {}
 
   void test(){
if(!list.empty())
     A val = list[0];
   }
 
   void append(A val){
list.append(val);
   }
 
   ~CMain() {}
 
private:
   QVector<A> list;
};
Записан
spectre71
Гость
« Ответ #39 : Июля 10, 2009, 11:42 »

А так еще лучше:

Код
C++ (Qt)
class B : public QObject
{
 Q_OBJECT
public:
   B(QObject *parent=0) : QObject(parent) {}
   ~B() {}
   explicit B(const B &b) : QObject(b.parent())  {assign(b);}
   inline B& operator = (const B &b)             {assign(b); return *this;}
 
public:
   void assign (const B &b) {/* do something*/}
};
 
Записан
dr_Begemot
Гость
« Ответ #40 : Июля 10, 2009, 11:47 »

А так еще лучше:

Код
C++ (Qt)
class B : public QObject
{
 Q_OBJECT
public:
   B(QObject *parent=0) : QObject(parent) {}
   ~B() {}
   explicit B(const B &b) : QObject(b.parent())  {assign(b);}
   inline B& operator = (const B &b)             {assign(b); return *this;}
 
public:
   void assign (const B &b) {/* do something*/}
};
 

Спасибо большое, сейчас попробую)
а что делает explicit?
Записан
spectre71
Гость
« Ответ #41 : Июля 10, 2009, 11:58 »

а что делает explicit?
Если просто, то запрещает неявное преобразование типа к В.
Записан
ритт
Гость
« Ответ #42 : Июля 10, 2009, 16:30 »

нахрена вообще твой B на основе QObject?
Записан
spectre71
Гость
« Ответ #43 : Июля 10, 2009, 16:42 »

нахрена вообще твой B на основе QObject?
Это не мой Грустный
Так задачу поставили - выше...
Записан
ритт
Гость
« Ответ #44 : Июля 10, 2009, 17:51 »

нахрена вообще твой B на основе QObject?
Это не мой Грустный
Так задачу поставили - выше...
собственно, это к автору вопрос...

dr_Begemot: ^^
Записан
Страниц: 1 2 [3] 4   Вверх
  Печать  
 
Перейти в:  


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