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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
#1

Вопрос про friend - C++

05.08.2011, 16:57. Просмотров 1247. Ответов 7
Метки нет (Все метки)

Вот мой код.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include<iostream>
using namespace std;
class Bottle;
class Carton
{
public:
    Carton(const Bottle& xBottle)
    {
        m_X = xBottle.m_H;
        m_Y = 3 * xBottle.m_A;
        m_Z = 3 * xBottle.m_Z;
    }
    void Print()
    {
        cout<<"Габаритные размеры коробки для бутылок :) X:Y:Z"<< m_X << ":"<< m_Y << ":" << m_Z
            <<endl;
    }
protected:
    int m_X;
    int m_Y;
    int m_Z;
};
/////////////////
class Bottle
{
public:
    Bottle(int a, int x):
      m_A(a), m_H(x)
      {
      }
protected:
    int m_A;
    int m_H;
    friend Carton::Carton(const Bottle& X);
};
typedef Bottle Botl;
typedef Carton Cart;
int main()
{
    setlocale(LC_ALL,"");
    Botl a(4,4);
    Cart s(a);
    s.Print();
}
Вродебы всё правильно.
Но компилятор ругается

1>c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(11): error C2027: использование неопределенного типа "Bottle"
1> c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(3): см. объявление "Bottle"
1>c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(11): error C2228: выражение слева от ".m_H" должно представлять класс, структуру или объединение
1>c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(12): error C2027: использование неопределенного типа "Bottle"
1> c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(3): см. объявление "Bottle"
1>c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(12): error C2228: выражение слева от ".m_A" должно представлять класс, структуру или объединение
1>c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(13): error C2027: использование неопределенного типа "Bottle"
1> c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(3): см. объявление "Bottle"
1>c:\documents and settings\user\мои документы\visual studio 2010\projects\784\784\1.cpp(13): error C2228: выражение слева от ".m_Z" должно представлять класс, структуру или объединение



В чем моя ошибка?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2011, 16:57     Вопрос про friend
Посмотрите здесь:

Friend для friend - C++
всем доброго времени суток, покажу проблему на примере: Class B; class A{ int F; friend B; public: A(){F=0;}; };

Вопрос про char - C++
Пожалуйста обьясните доступным языком в чем разница между объявлениями, и какие когда лучше использовать char a; char *c; char b=new...

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

Вопрос про конструктор - C++
цитата исходного кода из книги: class stock{ ... public: stock(); //Типа объявление конструктора по умолчанию чтоли... ...

Вопрос про память... - C++
Вот скажите пожалуйста в чем разница между int *p = new int; *p = 10; и int n = 10; не могу понять )

Вопрос про классы - C++
Такой пример. Базовый класс First, и два производных от него класса Second и Third. First*ar={new First(параметры),new Second(параметры),...

Вопрос про Swich - C++
Пример: int i=2; switch (i) { case 1: i += 2; case 2: i *= 3; case 0: i /= 2; case 4: i -= 5; default: ; } Выполнение оператора...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
05.08.2011, 17:01     Вопрос про friend #2
У вас после предложения

C++
1
class Bottle;
стоит по-моему точка с запятой. Уберите ее!
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
05.08.2011, 17:03     Вопрос про friend #3
Что бы использовать в конструкторе объект класса Bottle, этот класс к тому времени должен быть уже полностью определён. Здесь же он только объявлен, а определён ниже.
И что-то сомнительно, что другом можно сделать отдельную функцию-член класса, а не класс целиком.
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
05.08.2011, 17:03  [ТС]     Вопрос про friend #4
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас после предложения

C++
1
class Bottle;
стоит по-моему точка с запятой. Уберите ее!
Ты про 3 строчку?Если да то он ещё больше ошибок выдал.
Сыроежка
Заблокирован
05.08.2011, 17:04     Вопрос про friend #5
Цитата Сообщение от Сыроежка Посмотреть сообщение
У вас после предложения

C++
1
class Bottle;
стоит по-моему точка с запятой. Уберите ее!
Это я не внимательно посмотрел! Да, компилятору не хватает информации о классе Bottle. Он у вас объявлен как неполный тип. Поэтому кроме указателя на него, нельзя ссылаться на его члены.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
05.08.2011, 17:11     Вопрос про friend #6
Цитата Сообщение от grizlik78 Посмотреть сообщение
И что-то сомнительно, что другом можно сделать отдельную функцию-член класса, а не класс целиком.
Хотя мой компилятор говорит, что можно.
Ну, а плюс к первому замечанию, есть ещё обращение к xBottle.m_Z, а в классе Bottle такого члена нет.

Добавлено через 3 минуты
Вот в таком виде у меня компилируется. Только понятия не имею, правильно ли я изменил использование m_Z.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include<iostream>
using namespace std;
class Bottle;
class Carton
{
public:
        Carton(const Bottle& xBottle);
        void Print()
        {
                cout<<"Габаритные размеры коробки для бутылок :) X:Y:Z"<< m_X << ":"<< m_Y << ":" << m_Z
                        <<endl;
        }
protected:
        int m_X;
        int m_Y;
        int m_Z;
};
/////////////////
class Bottle
{
public:
        Bottle(int a, int x):
          m_A(a), m_H(x)
          {
          }
protected:
        int m_A;
        int m_H;
        friend Carton::Carton(const Bottle& X);
};
 
Carton::Carton(const Bottle& xBottle)
{
        m_X = xBottle.m_H;
        m_Y = 3 * xBottle.m_A;
        m_Z = 3 * xBottle.m_A;
}
 
typedef Bottle Botl;
typedef Carton Cart;
int main()
{
        setlocale(LC_ALL,"");
        Botl a(4,4);
        Cart s(a);
        s.Print();
}
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
05.08.2011, 17:11  [ТС]     Вопрос про friend #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Хотя мой компилятор говорит, что можно.
Ну, а плюс к первому замечанию, есть ещё обращение к xBottle.m_Z, а в классе Bottle такого члена нет.
Да эт я немного не то написал. Должно было быть m_A.xBottle
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 17:17     Вопрос про friend
Еще ссылки по теме:

Вопрос про указатели - C++
#include &lt;iostream.h&gt; int main() { int x; int *Pointer; pointer = &amp;x; cout &lt;&lt; pointer; cout &lt;&lt; *ponter; return 0; ...

Вопрос про mkdir - C++
У меня уже есть идея реализации но мне кажется есть способ проще! И так к делу вот часть кода точнее строчка WinExec(&quot;cmd /c mkdir...

Вопрос про реестр - C++
Здравствуйте господа програмисты!У меня есть программа,честно сознаюсь скачал с интернета и переделал не много,поэтому не доконца...

Вопрос про наследование. - C++
Добрый день всем! Возможно ли создать производный класс в который будут помещены 2 объекта базового класса с возможностью...

Вопрос про __function - C++
вопрос глупый, но все же: зачем в названии функциях пишут две __ - void __Plus(int a); - пример int __Display(int b) это для красоты...


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

Или воспользуйтесь поиском по форуму:
Ree.exe
56 / 56 / 4
Регистрация: 01.08.2011
Сообщений: 141
05.08.2011, 17:17  [ТС]     Вопрос про friend #8
grizlik78, да это то что мне и было нужно,
Yandex
Объявления
05.08.2011, 17:17     Вопрос про friend
Ответ Создать тему
Опции темы

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