Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
1

Почему не может быть такой функции?

04.09.2008, 15:54. Показов 4423. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
ofstream input_file(str1) ; такой строкой кода я открываю файл.

ofstream - тип обекта
input_file - обект типа ofstream

а тепрь я хочу открывать файл в другом месте программы использую функцию, а в место вызова возвращать объект типа ofstream

так почему же не компилируется моя функция?
C++
1
2
3
4
5
6
7
8
9
10
ofstream open_file_eror(CString str1)
{
    ofstream input_file(str1) ;
    if(input_file==NULL) cout<< "~~ERROR~~ input file "<< str1<<"\n";
    {
        cout<< "~~ERROR~~ input file "<< str1<<"\n";
 
    }
    return input_file;
}
ошибки -
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(21): error C2556: 'std::ofstream open_file_eror(ATL::CString)' : overloaded function differs only by return type from 'void open_file_eror(ATL::CString)'
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(21): error C2371: 'open_file_eror' : redefinition; different basic types
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(31): error C2556: 'std::ofstream open_file_eror(ATL::CString)' : overloaded function differs only by return type from 'void open_file_eror(ATL::CString)'
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.09.2008, 15:54
Ответы с готовыми решениями:

Почему у функции main() тип int? Почему не может быть какой-то другой, например, char?
Схема, касательно возвращаемого значения понятна. Не понятно почему именно целочисленное. Хелп)

Подскажите как может быть устроен такой датчик...
http://www.ebay.som/itm/POLE-TANK-SENDER-Fuel-wotir-Level-Liquid-Sensor-Gauge-Meter-250mm-length-/36...

Сколько вариантов может быть такой посадки деревьев?
Садоводу надо посадить 7 груш, 8 яблонь и 4 вишни в двух садах. Сколько вариантов может быть такой...

Что за баг может быть такой в VLC Player 2.1.2?
Здравствуйте! Много говорить не буду - только по сути. Создаю окно через WinAPI. Его клиентскую...

21
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 17:31 2
Компилер тебе, похоже, намекает, что у тебя redefinition одной и той же функции. И отличаются они только возвращаемыми значениями. Почмотри свой код, может, она еще где объявлена с void.
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 17:39  [ТС] 3
вобще не то я здесь написал совершенно другие куски кода
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 18:17 4
Теперь ты че-то пытаешься сделать со своим стримом (типа присваивания, или создания из другого стрима), для чего нужно вызвать конструктор копирования, а он не объявлен. Че-то в этим роде. Но связи с этим куском кода не вижу...
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 18:35  [ТС] 5
извиняюсь сейчас у меня такой код и такие ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
ofstram open_file_eror(CString str1);//эта функция открывает файл и обрабатывает ошибки связанные с открытием
ofstream open_file_error(CString str1)
{
    ofstream input_file(str1) ;
    if(input_file==NULL) cout<< "~~ERROR~~ input file "<< str1<<"\n";
    {
        cout<< "~~ERROR~~ input file "<< str1<<"\n";
 
    }
    return input_file;
}
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(28): error C2146: syntax error : missing ';' before identifier 'open_file_eror'
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(28): error C2501: 'ofstram' : missing storage-class or type specifiers
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(37): error C2558: class 'std::basic_ofstream<_Elem,_Traits>' : no copy constructor available or copy constructor is declared 'explicit'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 18:41 6
Видимо, компилер не знает, что такое "ofstram"... Может, ты хотел ему сказать "ofstream"?
1
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 18:45  [ТС] 7
Теперь ты че-то пытаешься сделать со своим стримом (типа присваивания, или создания из другого стрима), для чего нужно вызвать конструктор копирования, а он не объявлен. Че-то в этим роде. Но связи с этим куском кода не вижу...
извини я по ошибке вообще не тот код пихнул

Добавлено через 3 минуты 36 секунд
ага не знает))))) вот такой из меня прграммист.
текущее состояние -
C++
1
2
3
4
5
6
7
8
9
10
11
ofstream open_file_eror(CString str11);//эта функция открывает файл и обрабатывает ошибки связанные с открытием
ofstream open_file_error(CString str11)
{
    ofstream input_file(str11) ;
    if(input_file==NULL) cout<< "~~ERROR~~ input file "<< str11<<"\n";
    {
        cout<< "~~ERROR~~ input file "<< str11<<"\n";
 
    }
    return input_file;
}
еррор -
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(37): error C2558: class 'std::basic_ofstream<_Elem,_Traits>' : no copy constructor available or copy constructor is declared 'explicit'
with
[
_Elem=char,
_Traits=std::char_traits<char>
]
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 18:56 8
Я, конечно, фиг знает. Но, по-моему, не нормально пытаться возвращать объект из функции. Он, видимо, на return хотел бы выполнить конструктор копирования, но его нет.
Попробуй с указателем сделать:
Код
ofstream *open_file_eror(CString str11);
ofstream *open_file_error(CString str11)
{
    ofstream *input_file = new ofstream(str11) ;
    if(input_file==NULL) cout<< "~~ERROR~~ input file "<< str11<<"\n";
    return input_file;
}
Что-нибудь в таком роде... Соответственно, остальное тоже поменяй для работы с указателем.

Добавлено через 5 минут 34 секунды
Я убрал строки, так как, твой вышеприведенный код должен всегда выводить ERROR. У нас же блок уже вне условия...
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 19:29  [ТС] 9
не не всегда, почему это всегда???


"Но, по-моему, не нормально пытаться возвращать объект из функции. Он, видимо, на return хотел бы выполнить конструктор копирования, но его нет."
почему же не нормально?

ведь int, double, и особенно CString тоже обекты.

например такая функция может быть -
C++
1
2
3
4
5
CString open_file_error(CString str11)
{
   
    return str11;
}
я возвращаю объект из функции
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 19:32 10
Блин, это в принципе, идеологически не нормально. Ты не думаешь, что объект ты создаешь внутри функции? По сути, ты пересоздаешь еще объект для внешнего мира. У тебя объект-то локальный. Подумай-ка, а...
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 19:32  [ТС] 11
C++
1
2
3
4
5
6
7
8
9
10
11
ofstream *open_file_error(CString str11);//эта функция открывает файл и обрабатывает ошибки связанные с открытием
ofstream *open_file_error(CString str11)
{
    ofstream *input_file(str11) ;
    if(input_file==NULL) cout<< "~~ERROR~~ input file "<< str11<<"\n";
    {
        cout<< "~~ERROR~~ input file "<< str11<<"\n";
 
    }
    return input_file;
}
еррорс -
c:\documents and settings\я\мои документы\visual studio projects\kooltest\kooltest.cpp(31): error C2440: 'initializing' : cannot convert from 'ATL::CString' to 'std::ofstream *'
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 19:40 12
код с использованием указателей работает в несколько раз быстрее, так как, не вызывает никакого копирования и прочих операций над объектами.

Добавлено через 4 минуты 13 секунд
Блин, кто ж так объекты создает?!
Код
    ofstream *input_file(str11) ;
Ты прикалываешься? Память Александр Сергеевич будет выделять?
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 19:42  [ТС] 13
Блин, это в принципе, идеологически не нормально. Ты не думаешь, что объект ты создаешь внутри функции? По сути, ты пересоздаешь еще объект для внешнего мира. У тебя объект-то локальный. Подумай-ка, а...
Не вижу противоречия!!!!!!!
Всё что внутри функции локального характера.
для этого и нужен ретёрн - он выводит информацию во внешний мир.
C++
1
2
3
4
5
6
7
CString filename(CString mask_name1,CString filename1,int i1)
{
    CString slash("/"), txt(".txt"),str;
    str.Format("%s%s%s%d%s",mask_name1,slash, filename1,i1,txt);
    
    return str;
}
переменная str локальго характера но я же могуеё во вне получить!!!!! так:
C++
1
str=filename(mask_name,"_demand");
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 19:48 14
Я прям даже и не знаю. Влом объяснять то, что вы должны сами читать.

Ты пойми! Объект у тебя локальный! Как ты его из функции выведешь?! Никак. ТОлько конструктор копирования будет копировать все части твоего объекта во внешнюю переменную. А если его нет? Или он закрытый для нас. То некому. Вообще, нафига таким кривым идти? Указатели все делают гладко...

Смотри, блин, сюда внимательно! Пиши этот код:
Код
class a
{
public:
	a()
	{
		;
	}
	a(const a &)
	{
		cout<<"HI!"<<endl;
	}
};

a open_file_error()
{
	a i;
	cout<<&i<<endl;
	return i;
}

void main()
{
	a i = open_file_error();
	cout<<&i<<endl;
	cin.get();
}
Видишь HI в консоли?! Это тебе конструктор копирования привет передает! Посмотри и подумай теперь. А если не дойдет, то иди и бери книжку по классам. Если нет книги, дизассемблер и дебагер в руки. Я тут лекции расписывать не собираюсь, объясняя очевидные вещи...
1
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 19:50  [ТС] 15
Цитата Сообщение от Vourhey Посмотреть сообщение
код с использованием указателей работает в несколько раз быстрее, так как, не вызывает никакого копирования и прочих операций над объектами.

Добавлено через 4 минуты 13 секунд
Блин, кто ж так объекты создает?!
Код
     ;
Ты прикалываешься? Память Александр Сергеевич будет выделять?
я вообще не понимаю ведь ofstream толи это объект толи это поток.



Код
input_file= (ofstream*)calloc(1, sizeof(ofstream));
input_file(str11);
tak?
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 19:55 16
Блин, голову включи! Как он ее выводит?!?!?! Если это разные переменные?! Он копирует! Он копирует все из внутренней во внешнюю через конструктор копирования. Тьфу, блин. Читай книжки.

Код с указателями работает. Доказывать очевидное надоело... Что-нибудь еще?

Добавлено через 49 секунд
Боже, создай через new, пожалуйста...хоть конструктор нормально вызовешь...

Добавлено через 1 минуту 48 секунд
Блин, а вот теперь измени в предыдущем моем коде на:
Код
	}
private:
	a(const a &)
	{
		cout<<"HI!"<<endl;
	}
};
Ошибка будет! Вот теперь думай, почему... Уф. Я устал
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 19:56  [ТС] 17
Цитата Сообщение от Vourhey Посмотреть сообщение
Блин, башку включи! Как он ее выводит?!?!?! Если это разные переменные?! Он копирует! Он копирует все из внутренней во внешнюю через конструктор копирования. Тьфу, блин. Читай книжки.

Код с указателями работает. Доказывать очевидное надоело... Что-нибудь еще?

Добавлено через 49 секунд
может ты приведёшь пример рабочий этого дела?
тогда все споры отпадут.
я и сам понимаю что мне книжки нужно чиатать!
я их и читаю.
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 19:58 18
Ты издеваешься надо мной? Я ж те написал. На предыдущей странице.
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 20:10  [ТС] 19
по правде говоря нет.

ладно спасибо за помощь когда разберусь в твоих примерах напишу)
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
04.09.2008, 20:11 20
Разберись уж
0
04.09.2008, 20:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2008, 20:11
Помогаю со студенческими работами здесь

Нужен такой калькулятор, самый простой код, который только может быть

Почему такой бредовый вывод типов и как с этим быть?
Если так let add (a:float) (b:float) (c:float) = b * b - a * c;; то всё нормально val...

Почему может не быть индекса?
Есть серверная база. Есть пользователь с правами Эдитора. Для базы создан индекс, который...

Почему движок wordpress может быть плох
Авто портал - чересчур громко сказано, конечно. Но все равно, если я смогу реализовать такой сайт...

Может ли быть метод virtual static? И почему?
Очень нужно объяснение! В интернете ничего конкретно про это не написано.

Память не может быть Read, Почему так ???
Привет всем! MyClass::MyClass(TWinControl* mOwner) { RefreshBtn = new TBitBtn(mOwner); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru