Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> error C2653: 'classname' is not a class or namespa 
V
    Опции темы
wallstreet
Дата 7.4.2015, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Собственно компилятор MS VS2010, среда win32.
Попытка тестануть использование дружественного метода класса, оборачивается ошибкой:
Цитата

Error    1    error C2653: 'WS' : is not a class or namespace name    c:\users\пк\documents\visual studio 2010\projects\friendtest\friendtest\ta.h    9
Error    2    error C2248: 'TA::x' : cannot access private member declared in class 'TA'    c:\users\пк\documents\visual studio 2010\projects\friendtest\friendtest\ws.h    13


WS.h
Код

#pragma once
#include "TA.h"
class TA;
class WS
{
    int privatePer;
public:
    void show(TA& ta);
};

void WS::show(TA& ta)
{
    std::cout << ta.x;
}

TA.h
Код

#pragma once
#include "WS.h"
class TA
{
private:
    int x;
public:
    void initX(int per){x = per;}
    friend void WS::show(TA& ta);
};

main.cpp
Код

#include <iostream>
#include "WS.h"

int main()
{
    WS ws;
    TA ta;
    ta.initX(5);
    ws.show(ta);
    return 0;
}


Не могу понять в чем проблема и как ее решить.
Заранее благодарю. Любая помощь будет уместна.

Это сообщение отредактировал(а) wallstreet - 7.4.2015, 13:53
PM MAIL   Вверх
rudolfninja
Дата 7.4.2015, 14:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Приветсвую.
Тут, короче, ситуация такая, что у вас функция show использует ссылку на объект TA. Поэтому реализации функции show() должна быть объявлена после определения класса TA, иначе компилятор С++ выдаст сообщение об ошибке, что мы и видем.
Получается, что все эти классы надо помещать в один файл, примерно следующего содержания:

Код

#pragma once
#include <iostream>
class TA;
class WS
{
    int privatePer;
public:
    void show(TA& ta);
};

class TA
{
private:
    int x;
    friend void WS::show(TA& ta);
public:
    void initX(int per){ x = per; }
};

void WS::show(TA& ta)
{
    std::cout << ta.x;
}

PM MAIL Skype   Вверх
wallstreet
Дата 7.4.2015, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Благодарю за ответ. 
То что работает одним файлом это понятно smile Данная схема мне не подходит, поэтому и напоролся на эту ошибку. Отсюда уточняющий вопрос, как заставить класс TA определяться перед классом WS? И вообще возможно ли это?
PM MAIL   Вверх
rudolfninja
Дата 7.4.2015, 15:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Можно сделать целый класс WS дружественным TA, тогда тоже будет работать:

TA.h
Код

#pragma once
#include "WS.h"

class TA
{
private:
    int x;
    friend class WS;
public:
    void initX(int per){ x = per; }
};



WS.h
Код

#pragma once
#include "TA.h"
class TA;
class WS
{
    int privatePer;
public:
    void show(TA& ta);
};

void WS::show(TA& ta)
{
    std::cout << ta.x;
}


Еще есть вариант разбить класс WS на .h и .cpp файлы:

TA.h
Код

#pragma once
#include "WS.h"

class TA
{
private:
    int x;
    friend void WS::show(TA& ta);
public:
    void initX(int per){ x = per; }
};


WS.h
Код

#pragma once

class TA;
class WS
{
    int privatePer;
public:
    void show(TA& ta);
};


WS.cpp
Код

#include "WS.h"
#include <iostream>
#include "TA.h"

void WS::show(TA& ta)
{
    std::cout << ta.x;
}

Так тоже будет работать.
PM MAIL Skype   Вверх
wallstreet
Дата 7.4.2015, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 11.8.2011

Репутация: нет
Всего: нет



Спасибо. Решение оказалось на поверхности smile 

Это сообщение отредактировал(а) wallstreet - 7.4.2015, 15:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0780 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.