Russian Qt Forum
Ноябрь 26, 2024, 02:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 2 [3] 4   Вниз
  Печать  
Автор Тема: Не получается подружиться с QVector  (Прочитано 27348 раз)
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   Вверх
  Печать  
 
Перейти в:  


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