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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 27, средняя оценка - 4.93
Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
#1

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

04.09.2008, 15:54. Просмотров 3374. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему не может быть такой функции? (C++):

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

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

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

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

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

Может ли быть такое? - C++
поставил счетчик для сравнений в пирамидальной сортировке массива выдает 34732 сравнения. Добавлено через 1 час 3 минуты up!

21
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2008, 19:50
Привет! Вот еще темы с ответами:

Почему выдает такой результат? - C++
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; class X { int a; long b; public: ...

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

В чём может быть ошибка? - C++
Не пойму в чём ошибка в программе: #include &lt;iostream&gt; using namespace std; int main( ) // Program that...

В чём может быть ошибка? - C++
Описать функцию Power4(x,a,ξ) вещественного типа (параметры х, а, ξ - вещественные, |х|&gt;1; a,ξ &gt; 0), находящую приближенное значение...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
04.09.2008, 19:50
Ответ Создать тему
Опции темы

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