Ошибка в VS!!!!Помогите..
От: AndreyGor  
Дата: 29.09.05 17:35
Оценка:
Ошибка в 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-е изд.
Re: Ошибка в VS!!!!Помогите..
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 29.09.05 17:40
Оценка: :))) :))
Здравствуйте, AndreyGor, Вы писали:

AG>Ошибка в VS!!!!Помогите..


Ошибка, скорее всего, все-таки в примере кода, который ты забыл привести.
Ну да ничего, сейчас придут местные телепаты — они и без кода сразу все исправят.
Re[2]: Ошибка в VS!!!!Помогите..
От: Lorenzo_LAMAS  
Дата: 30.09.05 08:36
Оценка: :)))
Здравствуйте, Alxndr, Вы писали:

A>Здравствуйте, AndreyGor, Вы писали:


AG>>Ошибка в VS!!!!Помогите..


A>Ошибка, скорее всего, все-таки в примере кода, который ты забыл привести.

A>Ну да ничего, сейчас придут местные телепаты — они и без кода сразу все исправят.

Начинаю сеанс шарлатан... тфу телепатии!

Можно предположить, что человек пишет операторы << для своих классов. И у нгео где-то есть using namespace std; , а операторы определены вне класса. В шестом вижуале был такой глюк. Правда, его не должно быть в ВС 2003. Ну на то я и шарла... тфы, телепат.
Of course, the code must be complete enough to compile and link.
Re[2]: Ошибка в VS!!!!Помогите..
От: AndreyGor  
Дата: 30.09.05 13:19
Оценка:
Здравствуйте, 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;
}

int main()
{
inventory ob("hammer", 4, 12.55);
cout << ob;
cin >> ob;
cout << ob;
return 0;
}
Re[3]: Ошибка в VS!!!!Помогите..
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 30.09.05 13:41
Оценка:
Здравствуйте, 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.
Re[4]: офтоп
От: Глеб Алексеев  
Дата: 30.09.05 13:48
Оценка:
Здравствуйте, Alxndr, Вы писали:
AG>>Вот собственно пример из Шилдта:
A>
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>>}
A>

Офтоп:
теперь я понимаю, отчего ругают Шилдта (сам не читал). Считывать объект, например, из файла, выводя приглашения в cout — это круто. Хорошо, что он у istream'у ввести название предмета не предлагает.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: офтоп
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 30.09.05 13:49
Оценка: +1
Здравствуйте, Глеб Алексеев, Вы писали:

ГА>Офтоп:

ГА>теперь я понимаю, отчего ругают Шилдта (сам не читал). Считывать объект, например, из файла, выводя приглашения в cout — это круто. Хорошо, что он у istream'у ввести название предмета не предлагает.

Да ладно, книги-то "для самых маленьких".
Re[3]: Ошибка в VS!!!!Помогите..
От: Lorenzo_LAMAS  
Дата: 30.09.05 14:23
Оценка: :)
Однако, я удагал
Of course, the code must be complete enough to compile and link.
Re[4]: Ошибка в VS!!!!Помогите..
От: Lorenzo_LAMAS  
Дата: 30.09.05 14:28
Оценка:
Здравствуйте, 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.
Re[5]: Ошибка в VS!!!!Помогите..
От: Alxndr Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 30.09.05 15:19
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>Однако, я удагал


L_L>Люблю я потормозить. Слово с ошибкой написал. Попробовал удалить ссобщение, бобма ни туда повесилась. Тфу! Точно шарлатан.


L_L>Короче, по существу — тебе надо либо убрать using namespace std; и писать имена из пространства имен стд с квалификацией, т.е. std::ostream, stdd::cout, std::endl, либо определить операторы друзья прямо в классе. Это известный глюкан вижуала (6го, по крайней мере).


Сер Лоренцо, мне кажется ошибка тут все же в перепутанном операторе ("<<" вместо ">>").
Re[6]: Ошибка в VS!!!!Помогите..
От: AndreyGor  
Дата: 01.10.05 08:41
Оценка:
Народ, спасибо всем за ответы. И все-таки, почему ошибка появляется только на некоторых компах??
Ставилась студия с одного и того же диска. Например, наблюдал это на двух машинах с установленной Win 2000!!!!!
Re[7]: Ошибка в VS!!!!Помогите..
От: Lorenzo_LAMAS  
Дата: 01.10.05 09:18
Оценка:
Здравствуйте, 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 то все получится. Это-то ты попробовал сделать?

Да пробовал, конечно. Работает. Спасибо большое за совет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.