Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
#1

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

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

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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2008, 15:54
Ответы с готовыми решениями:

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

Почему конструктор в отличаи от деструктора не может быть виртуальным?
Вопрос озвучен :). Желательно, с разжёваным ответом. Спасибо

В чем может быть ошибка? (передача аргументов функции)
Есть двумерный массив, симулирующий игровое поле (0 означают пустоту, 8 игрок)...

Как такое может быть? (вызов функции-члена без объекта)
собственно вопрос озвучен. #include &lt;iostream&gt; using namespace std; ...

Почему тип входящего параметра функции может отличаться от типа возвращаемого значения?
Зачем здесь указываеться другой тип данных: double &amp;change_it(int i); ...

21
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 17:31 #2
Компилер тебе, похоже, намекает, что у тебя redefinition одной и той же функции. И отличаются они только возвращаемыми значениями. Почмотри свой код, может, она еще где объявлена с void.
0
Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
04.09.2008, 17:39  [ТС] #3
вобще не то я здесь написал совершенно другие куски кода
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 18:17 #4
Теперь ты че-то пытаешься сделать со своим стримом (типа присваивания, или создания из другого стрима), для чего нужно вызвать конструктор копирования, а он не объявлен. Че-то в этим роде. Но связи с этим куском кода не вижу...
0
Beliy_shum
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
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 18:41 #6
Видимо, компилер не знает, что такое "ofstram"... Может, ты хотел ему сказать "ofstream"?
1
Beliy_shum
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
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
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
Beliy_shum
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
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 19:32 #10
Блин, это в принципе, идеологически не нормально. Ты не думаешь, что объект ты создаешь внутри функции? По сути, ты пересоздаешь еще объект для внешнего мира. У тебя объект-то локальный. Подумай-ка, а...
0
Beliy_shum
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
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 19:40 #12
код с использованием указателей работает в несколько раз быстрее, так как, не вызывает никакого копирования и прочих операций над объектами.

Добавлено через 4 минуты 13 секунд
Блин, кто ж так объекты создает?!
Код
    ofstream *input_file(str11) ;
Ты прикалываешься? Память Александр Сергеевич будет выделять?
0
Beliy_shum
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
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
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
Beliy_shum
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
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 19:55 #16
Блин, голову включи! Как он ее выводит?!?!?! Если это разные переменные?! Он копирует! Он копирует все из внутренней во внешнюю через конструктор копирования. Тьфу, блин. Читай книжки.

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

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

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

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

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

ладно спасибо за помощь когда разберусь в твоих примерах напишу)
0
Vourhey
Почетный модератор
6492 / 2266 / 185
Регистрация: 29.07.2006
Сообщений: 12,534
04.09.2008, 20:11 #20
Разберись уж
0
04.09.2008, 20:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2008, 20:11

Может ли быть такое?
поставил счетчик для сравнений в пирамидальной сортировке массива выдает 34732...

В чём может быть ошибка?
Описать функцию Power4(x,a,ξ) вещественного типа (параметры х, а, ξ -...

Память не может быть прочитана!
Проблема возникает при копировании одного массива в другой. Я вроди просмотрел...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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