Форум программистов, компьютерный форум CyberForum.ru

std::vector<T>.push_back(T) - Error - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Тетрис: начало http://www.cyberforum.ru/cpp-beginners/thread341820.html
Здравствуйте. Захотелось мне сделать тетрис. Консольный, некрасивый, но рабочий. Так как мой скилл программирования невысок, то решил начать с малого — научить программку генерировать случайные символы (в дальнейшем это будут фигуры), кидать в случайный столбец двумерного массива, скидывать вниз и складывать стопочкой. В общем-то, все работает как надо, но когда один символ сверху падает на...
C++ Что такое двумерный массив? Не буду долго объяснять мотивы subj-а, но не получается организовать работу с матрицей как с массивом векторов. Пытаюсь написать цикл просмотра массива с использованием указателя на элемент в качестве счетчика. Для вектора int b={1,2,3,4,5}; for (int *i=b; i<b+5; ++i) std::cout<<*i<<' '; Для матрицы, если считать что структура представлена вектором в котором строки последовательно... http://www.cyberforum.ru/cpp-beginners/thread341769.html
Копирую строчки двумерного массива и программа начинает вести себя странно C++
В общем, есть некоторый полузапиленный код. #include <iostream> #include <cstdlib> #include <stdlib.h> #include <conio.h> #include <time.h> using namespace std; void showmass(int**, int, int); void showmass(int*, int);
C++ При компиляции не может найти хеадер
Написал программу.. она пашет, но когда весь код в main.cpp. Решил ее усовершенствовать, чтобы мейн имел красивее вид, сделал вот так: main.cpp: #include <iostream> #include <fstream> #include "clRead.h" int main(){ ifstream iF("One.txt", ios::in);
C++ Бот http://www.cyberforum.ru/cpp-beginners/thread341691.html
Порекомендуйте библиотеки для имитации нажатия клавиш, кнопок мыши и анализа пикселей с экрана. Хочу написать простенького бота для онлайн игры.
C++ Как убрать знак минус У меня int a = -7. Как программно получить a = 7? подробнее

Показать сообщение отдельно
Сыроежка
Заблокирован
14.08.2011, 16:42     std::vector<T>.push_back(T) - Error
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
Хмм.. У меня MSVS на такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
class A {
public:
    A(int _n = 0) {n = _n;}
    A(A &rhs) {n = rhs.n;}
        int get_num(void) const {return n;}
        void set_num(const int _n) {n = _n;}
private:
        int n;
};
 
int main(void)
{
    const A ca(11);
    A a(ca);
     
    return 0;
}
выдает следующее: error C2558: class 'A' : no copy constructor available or copy constructor is declared 'explicit'

Добавлено через 4 минуты
А, ну получается то, так же как и с обычным конструктором. Если есть конструктор с параметрами, то дефолтный, компилятор генерировать не будет..

У вас выдает ошибку, потому что вы пытаетесь построить объект класса на основе константного объекта, а конструктора, который получает ссылку на константный объект у вас нет. То есть вам следовало бы объявить конструктор копирования следующим образом

C++
1
A(const A &rhs) {n = rhs.n;}
Либо вообще не объявлять констатные объеукты своего класса. Но тогда у вас будут проблемы с временными объяктами.

Добавлено через 1 минуту
Цитата Сообщение от Bers Посмотреть сообщение
Я точно не знаю. Но у меня есть подозрение, что

A(A &rhs) {n = rhs.n;} //не является копирующим конструктором, потому что клиенты ожидают что будит конструктор с константой.

Однако, так как он все таки есть (хоть и не константный), то компилятор уже не генерит дефолтный (с константой), в результате, клиенты вообще не получают никакого конструктора, ни явного, ни дефолтного.

Может быть я и ошибаюсь.
Не надо подозрений! Нужно точно знать, что это является конструктором копирования. Другое дело, что этот конструктор копирования не может работать с констатными объектами.

Добавлено через 4 минуты
Цитата Сообщение от Net_Wanderer Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
 
class A {
public:
    A(int _n = 0) {n = _n;}
    A(A &rhs)
    {
        n = rhs.n;
        std::cout << "copy constructor...\n";
    }
    int get_num(void) const {return n;}
    void set_num(const int _n) {n = _n;}
private:
    int n;
};
 
void foo(A a)
{
    a.set_num(1138);
}
 
int main(void)
{
    A aobj;
 
    foo(aobj);  
     
    return 0;
}
Обьект передается в foo по значению, вызвается конструктор копирования, сообщение выводится
Дело в том, что аргументом вашей функции является выражение, то есть rvalue, а оно должно связываться с константной ссылкой, когда используется для формирования значения параметра функции.
 
Текущее время: 07:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru