Здравствуйте, AndreyGor, Вы писали:
AG>Ошибка в VS!!!!Помогите..
Ошибка, скорее всего, все-таки в примере кода, который ты забыл привести.
Ну да ничего, сейчас придут местные телепаты — они и без кода сразу все исправят.
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, AndreyGor, Вы писали:
AG>>Ошибка в VS!!!!Помогите..
A>Ошибка, скорее всего, все-таки в примере кода, который ты забыл привести. A>Ну да ничего, сейчас придут местные телепаты — они и без кода сразу все исправят.
Начинаю сеанс шарлатан... тфу телепатии!
Можно предположить, что человек пишет операторы << для своих классов. И у нгео где-то есть using namespace std; , а операторы определены вне класса. В шестом вижуале был такой глюк. Правда, его не должно быть в ВС 2003. Ну на то я и шарла... тфы, телепат.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Глеб Алексеев, Вы писали:
ГА>Офтоп: ГА>теперь я понимаю, отчего ругают Шилдта (сам не читал). Считывать объект, например, из файла, выводя приглашения в cout — это круто. Хорошо, что он у istream'у ввести название предмета не предлагает.
Ошибка в VS!!!!Помогите..
Проблема следующая: дружественные функции не могут получить доступ к закрытым членам класса.Выдается ошибка:
D:\Program Files\Microsoft Visual Studio\MyProjects\Shild\shild.cpp(31) : error C2248: 'item' : cannot access private member declared in class 'inventory'
D:\Program Files\Microsoft Visual Studio\MyProjects\Shild\shild.cpp(8) : see declaration of 'item'
Происходит это на только определенных компах — на одних работает, на др. нет. Пробовал под Win 98, 2000, XP. Причем, ставил как VS 98, так и VS 2003!! Не понимаю, в чем дело.Примеры брал как самописные так и, например, из "Шилдт. Самоучитель по С++" , 3-е изд.
Здравствуйте, Alxndr, Вы писали:
A>Здравствуйте, AndreyGor, Вы писали:
AG>>Ошибка в VS!!!!Помогите..
A>Ошибка, скорее всего, все-таки в примере кода, который ты забыл привести. A>Ну да ничего, сейчас придут местные телепаты — они и без кода сразу все исправят.
Вот собственно пример из Шилдта:
#include <iostream>
#include <cstring>
using namespace std;
class inventory
{
char item[40] ; // название предмета
int onhand; // количество предметов на руках
double cost; // цена предмета
public:
inventory (char *i, int o, double c)
{
strcpy(item, i) ;
onhand = o;
cost = c;
}
friend ostream &operator<< (ostream &stream, inventory ob) ;
friend istream &operator<< (istream &stream, inventory &ob) ;
};
ostream &operator<< (ostream &stream, inventory ob)
{
stream << ob.item << ": " << ob. onhand;
stream << " на руках по цене $" << ob.cost << '\n';
return stream;
}
istream &operator>> (istream &stream, inventory &ob)
{
cout << "Введите название предмета: ";
stream >> ob.item;
cout << "Введите число выданных на руки экземпляров: ";
stream >> ob.onhand;
cout << "Введите стоимость экземпляра: ";
stream >> ob.cost;
return stream;
}
Здравствуйте, AndreyGor, Вы писали:
AG>Здравствуйте, Alxndr, Вы писали:
A>>Здравствуйте, AndreyGor, Вы писали:
AG>>>Ошибка в VS!!!!Помогите..
A>>Ошибка, скорее всего, все-таки в примере кода, который ты забыл привести. A>>Ну да ничего, сейчас придут местные телепаты — они и без кода сразу все исправят.
AG>Вот собственно пример из Шилдта:
А форматированием кто будет пользоваться? Дядя Герберт?
AG>#include <iostream>
AG>#include <cstring>
AG>using namespace std;
AG>class inventory
AG>{
AG> char item[40] ; // название предмета
AG> int onhand; // количество предметов на руках
AG> double cost; // цена предмета
AG>public:
AG> inventory (char *i, int o, double c)
AG> {
AG> strcpy(item, i) ;
AG> onhand = o;
AG> cost = c;
AG> }
AG> friend ostream &operator<< (ostream &stream, inventory ob) ;
AG> friend istream &operator<< (istream &stream, inventory &ob) ; // ?
AG>};
...
AG>istream &operator>> (istream &stream, inventory &ob) // !
AG>{
AG> cout << "Введите название предмета: ";
AG> stream >> ob.item;
AG> cout << "Введите число выданных на руки экземпляров: ";
AG> stream >> ob.onhand;
AG> cout << "Введите стоимость экземпляра: ";
AG> stream >> ob.cost;
AG> return stream;
AG>}
Ну, что и требовалось доказать — верблюд все-таки не VC.
See for comments in code.
AG>>{
AG>> cout << "Введите название предмета: ";
AG>> stream >> ob.item;
AG>> cout << "Введите число выданных на руки экземпляров: ";
AG>> stream >> ob.onhand;
AG>> cout << "Введите стоимость экземпляра: ";
AG>> stream >> ob.cost;
AG>> return stream;
AG>>}
A>
Офтоп:
теперь я понимаю, отчего ругают Шилдта (сам не читал). Считывать объект, например, из файла, выводя приглашения в cout — это круто. Хорошо, что он у istream'у ввести название предмета не предлагает.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Однако, я удагал
Люблю я потормозить. Слово с ошибкой написал. Попробовал удалить ссобщение, бобма ни туда повесилась. Тфу! Точно шарлатан.
Короче, по существу — тебе надо либо убрать using namespace std; и писать имена из пространства имен стд с квалификацией, т.е. std::ostream, stdd::cout, std::endl, либо определить операторы друзья прямо в классе. Это известный глюкан вижуала (6го, по крайней мере).
#include <iostream>
#include <cstring>
using namespace std;
class inventory
{
char item[40] ; // название предметаint onhand; // количество предметов на рукахdouble cost; // цена предметаpublic:
inventory (char *i, int o, double c)
{
strcpy(item, i) ;
onhand = o;
cost = c;
}
friend ostream &operator<< (ostream &stream, inventory ob)
{
stream << ob.item << ": " << ob. onhand;
stream << " на руках по цене $" << ob.cost << '\n';
return stream;
}
friend istream &operator>> (istream &stream, inventory &ob)
{
cout << "Введите название предмета: ";
stream >> ob.item;
cout << "Введите число выданных на руки экземпляров: ";
stream >> ob.onhand;
cout << "Введите стоимость экземпляра: ";
stream >> ob.cost;
return stream;
}
};
int main()
{
inventory ob("hammer", 4, 12.55);
cout << ob;
cin >> ob;
cout << ob;
return 0;
}
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>>Однако, я удагал
L_L>Люблю я потормозить. Слово с ошибкой написал. Попробовал удалить ссобщение, бобма ни туда повесилась. Тфу! Точно шарлатан.
L_L>Короче, по существу — тебе надо либо убрать using namespace std; и писать имена из пространства имен стд с квалификацией, т.е. std::ostream, stdd::cout, std::endl, либо определить операторы друзья прямо в классе. Это известный глюкан вижуала (6го, по крайней мере).
Сер Лоренцо, мне кажется ошибка тут все же в перепутанном операторе ("<<" вместо ">>").
Народ, спасибо всем за ответы. И все-таки, почему ошибка появляется только на некоторых компах??
Ставилась студия с одного и того же диска. Например, наблюдал это на двух машинах с установленной Win 2000!!!!!
Здравствуйте, AndreyGor, Вы писали:
AG>Народ, спасибо всем за ответы. И все-таки, почему ошибка появляется только на некоторых компах?? AG>Ставилась студия с одного и того же диска. Например, наблюдал это на двух машинах с установленной Win 2000!!!!!
Версия виндовса параллельна. Черная магия — фуфло. Шаманский бубен — тоже.
А вот версия компилятора — ДА. Еще раз. В версии VS 6.0 была проблема : если ты где-то писал using namespace std; в классе объявлялся friend оператор << или >> (не уверен, как с другими операторами — не помню, но так как из стд в примере ostream/istream, то думаю, это особенность << и >>). Далее, если ты определяшь оператор-друг ВНЕ класса, который объявил его другом и пытаешься использовать закрытые члены этого класса, то возникает ошибка. Но, если ты его определишь В КЛАССЕ, либо уберешь using namespace std то все получится. Это-то ты попробовал сделать?
Of course, the code must be complete enough to compile and link.
Re[8]: Ошибка в VS!!!!Помогите..
От:
Аноним
Дата:
02.10.05 10:56
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:
L_L>Версия виндовса параллельна. Черная магия — фуфло. Шаманский бубен — тоже. L_L>А вот версия компилятора — ДА. Еще раз. В версии VS 6.0 была проблема : если ты где-то писал using namespace std; в классе объявлялся friend оператор << или >> (не уверен, как с другими операторами — не помню, но так как из стд в примере ostream/istream, то думаю, это особенность << и >>). Далее, если ты определяшь оператор-друг ВНЕ класса, который объявил его другом и пытаешься использовать закрытые члены этого класса, то возникает ошибка. Но, если ты его определишь В КЛАССЕ, либо уберешь using namespace std то все получится. Это-то ты попробовал сделать?
Да пробовал, конечно. Работает. Спасибо большое за совет.