Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.10.2010, 16:28   #1
jennya
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 30
По умолчанию Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора

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

Код:
#include <iostream>
#include <cstdlib>
using namespace std;
class myclass {
	int a;
public:
	myclass (int x) {a = x;}
	myclass (char *str) {a = atoi(str);}
	int geta() {return a;}
};
int main()
{
	myclass ob1 = 4;
	myclass ob2 = "123";
	
	cout << "ob1: " << ob1.geta() << endl;
	cout << "ob2: " << ob2.geta() << endl;
	
	myclass ob1 = "2001";
	myclass ob1 = 2010;

    cout << "ob1: " << ob1.geta() << endl;
	cout << "ob2: " << ob2.geta() << endl;
	return 0;
}
При компиляции возникает ошибка:

Error 1 error C2374: 'ob1' : redefinition; multiple initialization c:\users\администратор\documents\vi sual studio 2008\projects\c++\console\p421\p421 \p421.cpp 19 p421
Error 2 error C2374: 'ob1' : redefinition; multiple initialization c:\users\администратор\documents\vi sual studio 2008\projects\c++\console\p421\p421 \p421.cpp 20 p421
Как ее исправить? Заранее огромное спасибо.

Последний раз редактировалось Stilet; 02.10.2010 в 16:58.
jennya вне форума Ответить с цитированием
Старый 02.10.2010, 16:38   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

Код:
#include <iostream>
#include <cstdlib>

using namespace std;

class myclass {
public:
	myclass (const int x)
	{
		a = x;
	}
	
	myclass (const char *str)
	{
		a = atoi(str);
	}
	
	int geta()
	{
		return a;
	}

private:
	int a;
};

int main()
{
	myclass ob1 = 4;
	myclass ob2 = "123";

	cout << "ob1: " << ob1.geta() << endl;
	cout << "ob2: " << ob2.geta() << endl;

	myclass ob3 = "2001";
	myclass ob4 = 2010;

	cout << "ob3: " << ob3.geta() << endl;
	cout << "ob4: " << ob4.geta() << endl;

	return 0;
}
Цитата:
myclass ob1 = 4;
myclass ob2 = "123";


cout << "ob1: " << ob1.geta() << endl;
cout << "ob2: " << ob2.geta() << endl;

myclass ob1 = "2001";
myclass ob1 = 2010;
с одинаковыми именами объекты завел. + нужно константность указывать при автоматическом преобразовании.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.10.2010, 16:50   #3
jennya
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 30
По умолчанию

Огромное спасибо!!!

Еще вопрос, а как запретить эти преобразования:

#include <iostream>
#include <cstdlib>
using namespace std;
class myclass {
int a;
public:
explicit myclass (int x) {a = x;}
explicit myclass (char *str) {a = atoi(str);}
int geta() {return a;}
};
int main()
{
myclass ob1 = 4;
myclass ob2 = "123";
cout << "ob1: " << ob1.geta() << endl;
cout << "ob2: " << ob2.geta() << endl;
return 0;
}

компилятор выдает ошибку:
Error 1 error C2440: 'initializing' : cannot convert from 'int' to 'myclass' c:\users\администратор\documents\vi sual studio 2008\projects\c++\console\p422\p422 \p422.cpp 13 p422
Error 2 error C2440: 'initializing' : cannot convert from 'const char [4]' to 'myclass' c:\users\администратор\documents\vi sual studio 2008\projects\c++\console\p422\p422 \p422.cpp 14 p422

Последний раз редактировалось Stilet; 02.10.2010 в 23:18.
jennya вне форума Ответить с цитированием
Старый 02.10.2010, 19:40   #4
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
нужно константность указывать при автоматическом преобразовании.
Простите, а зачем?
coinkrsk вне форума Ответить с цитированием
Старый 02.10.2010, 20:00   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2coinkrsk
а ты сам подумай

Код:
class A {
public:
A(const char *str) {}
};

A a = "123";
какой смысл не в константности? чтобы случайно ошибку сделать?

2jennya
Цитата:
Еще вопрос, а как запретить эти преобразования:
Цитата:
компилятор выдает ошибку:
а что он тебе выдавать должен? вот ты и запретил преобразования с помощью explicit
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 02.10.2010, 21:25   #6
jennya
Пользователь
 
Регистрация: 21.06.2010
Сообщений: 30
По умолчанию Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора

Спасибо всем:
jennya вне форума Ответить с цитированием
Старый 03.10.2010, 07:58   #7
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

2proger
Это я к тому, что указывать константность, с точки зрения языка, совершенно не обязательно.
coinkrsk вне форума Ответить с цитированием
Старый 03.10.2010, 14:57   #8
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2coinkrsk
нормальный компилятор должен на такое ругаться. как и на char *s = "123";
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 03.10.2010, 19:03   #9
coinkrsk
пыжашийся нуб
Пользователь
 
Регистрация: 19.06.2010
Сообщений: 93
По умолчанию

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


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Повторный вызов конструктора класса EUGY Общие вопросы C/C++ 13 28.09.2010 16:00
Вызов конструктора суперкласса Golovastik PHP 1 04.07.2010 00:35
Создание конструктора Superlotles Общие вопросы C/C++ 5 23.05.2010 01:38
Вопрос про new и вызов конструктора Gtx541 Общие вопросы C/C++ 5 20.05.2010 12:18
Параметр конструктора Voody Компоненты Delphi 6 14.12.2009 19:52