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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
moskitos80
61 / 61 / 10
Регистрация: 04.10.2011
Сообщений: 217
Завершенные тесты: 1
#1

Конструктор копирования - C++

08.08.2012, 17:33. Просмотров 677. Ответов 6
Метки нет (Все метки)

Всем привет. У меня такая проблема: есть некий класс, допустим Test:

C++
1
2
3
4
5
6
7
8
9
10
11
class Test 
{
    protected:
        int value;
 
    public :
        Test(int v)
        {
            this->value = v;
        }
};
Этот класс я указал просто для наглядности проблемы. Я хочу при инициализации объектов использовать такой синтаксис:

C++
1
2
Test t = 10,
       t2 = t;
В принципе конструктор: Test(int v) мне это как раз и позволяет. А теперь такая ситуация, представим что при копировании мне нужно производить некие дополнительные действия, не важно какие. Первой моей попыткой было переопределить конструктор копирования (полный листинг)

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
30
31
32
33
#include <iostream>
 
using namespace std;
 
////////////////////////////////////////////////////////////////////////////////
 
class Test 
{
    protected:
        int value;
 
      public :  
          
          Test(int v)
          {
              this->value = v;
          }
          Test(Test& t)  // Переопределил :)
          {
              this->value = t.value;
          }
};
 
////////////////////////////////////////////////////////////////////////////////
 
int main() 
{
    Test t  = 10,  // error: no matching function for call to 'Test::Test(Test)'
           t2 = t;
    
    system("PAUSE");
    return 0;
}
И вот тут компилятор выдаёт: error: no matching function for call to 'Test::Test(Test)' Но я не могу определить такую конструкцию: Test(Test) - это получается конструктор копирования с параметром передаваемым по значению, а это не допустимо. Вот и вопрос как в подобной ситуации переопределить конструктор копирования?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2012, 17:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Конструктор копирования (C++):

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования - C++
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных задаются длины трех сторон треугольника. Класс...

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;math.h&gt; #include &lt;algorithm&gt; using...

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

Конструктор копирования в c++ - C++
Добрый день, такая задача по с++ Какая ошибка в следующей реализации конструктора копирования по умолчанию и деструктора?? Какой еще...

Конструктор копирования - C++
class alpha { public: alpha(alpha&amp; a) { //код } }; Подскажите, почему компилятор ругается если я пытаюсь передать...

6
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2012, 17:40 #2
C++
1
Test(const Test&)
0
moskitos80
61 / 61 / 10
Регистрация: 04.10.2011
Сообщений: 217
Завершенные тесты: 1
08.08.2012, 17:46  [ТС] #3
Цитата Сообщение от soon Посмотреть сообщение
C++
1
Test(const Test&)
Да так работает, а не могли бы Вы объяснить почему так правильно?
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2012, 18:09 #4
Цитата Сообщение от moskitos80 Посмотреть сообщение
Да так работает, а не могли бы Вы объяснить почему так правильно?
В данном случае "правильно" - не то слово. Скорее "работает". А правильно вызывать конструтор и передавать ему параметр. И писать explicit.

Так вот, в случае с Test&, у компилятора есть два пути, один из которых - кастануть 10 в Test и попробовать вызвать конструтор с параметром Test. Поскольку Test& - lvalue, а Test может быть как rvalue, так и lvalue, то и преобразовать не получается.

Поэтому, более правильно будет добавить explicit и использовать Test t(10). Но раз вам нужен другой синтаксис - используйте просто const Test&
0
moskitos80
61 / 61 / 10
Регистрация: 04.10.2011
Сообщений: 217
Завершенные тесты: 1
08.08.2012, 18:27  [ТС] #5
Цитата Сообщение от soon Посмотреть сообщение
Поскольку Test& - lvalue, а Test может быть как rvalue, так и lvalue, то и преобразовать не получается.
Вы меня простите пожалуйста, я не очень понимаю, что это значит rvalue и lvalue. Я только недавно начал изучать С++
0
soon
2541 / 1306 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
08.08.2012, 18:30 #6
moskitos80, можете считать, что lvalue может находиться как слева от знака присваивания, так и справа. rvalue-же может быть только справа. Сначала это не столь важно.
1
moskitos80
61 / 61 / 10
Регистрация: 04.10.2011
Сообщений: 217
Завершенные тесты: 1
08.08.2012, 18:37  [ТС] #7
Теперь понял спасибо, а про explicit мне ещё только предстоит узнать
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2012, 18:37
Привет! Вот еще темы с ответами:

Конструктор копирования - C++
Здравствуйте) объясните пожалуйста в чём проблема при описании в классе конструктора копирования компилятор выдаёт ошибку:error C3699:...

Конструктор копирования - C++
#include &lt;iostream&gt; using namespace std; class test { public: int x; test(int num); test(const...

Конструктор копирования - C++
Добрый вечер. Начал изучать перегрузку операций и конструктор копирования. Лазил в инете и налепил такой код. Только вот не могу понять как...

Конструктор копирования - C++
Есть вопрос. Как объект одного класса передать в объект другого класса?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
08.08.2012, 18:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru