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

Правильное оформление друж-х ф-й - C++

Восстановить пароль Регистрация
 
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
18.12.2010, 20:26     Правильное оформление друж-х ф-й #1
Добрый вечер!
Компилятор ругается на то, что друж-я ф-ция использует private - поля класса. Попробовал положить определение в StdAfx.h, а в StdAfx.cpp положить описание. Пробовал положить описание в .cpp класса.
Разъясните, пожалуйста.
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
 
#include "Quadric.h"
 
 
class Quadric  
{
    double a, b, c;
    double d, x1, x2;
public:
    Quadric();
    Quadric(double, double, double);
    virtual ~Quadric();
    friend istream& operator >>(istream&, Quadric&);
    friend ostream& operator <<(ostream&, Quadric&);
    bool checkValidity();
    void solve();
    char* getResult();
 
 
};
 
Quadric::Quadric(): a(1): b(1): c(1)
{
    d = b*b - 4*a*c;
}
 
Quadric::Quadric(double a_, double b_, double c_): a(a_): b(b_): c(c_)
{
    d = b*b - 4*a*c;
}
 
Quadric::~Quadric()
{
 
}
 
 
 
bool Quadric::checkValidity()
{
    (a) && (d>=0) ? return true: return false;
}
 
void Quadric::solve()
{
    if(checkValidity())
    {
        x1 = (-b + sqrt(d))/2;
        x2 = (-b - sqrt(d))/2;
    }
 
    cout<<getResult();
}
 
char* Quadric::getResult()
{
    char *str = '\0';
    sprintf(str,"Answer: X1 = %d, X2 = %d\n",x1,x2);
 
    return str;
}
 
 
[B]StdAfx.cpp[/B]
 
istream& operator >>(istream& stream, Quadric& qe)
{
    cout<<"a:";
    stream>>qe.a;
    cout<<"b:";
    stream>>qe.b;
    cout<<"c:";
    stream>>qe.c;
 
    return stream;
}
 
ostream& operator <<(ostream& stream, Quadric& qe)
{
    stream<<qe.a<<" + "<<pow(2,qe.b)<<" + "<<qe.c<<" = 0\n";
 
    if(!qe.checkValidity())
    {
        stream<<"D < 0 or a = 0!\n";
    }
    else
    {
        stream<<"X1 = "<<qe.x1<<"X2 = "<<qe.x2<<"\n";
    }
 
    return stream;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.12.2010, 18:19     Правильное оформление друж-х ф-й #2
Списки инициализации разделяются запятыми.
C++
1
2
3
4
5
6
7
8
9
10
// запятые разделяют списки инициализации
Quadric::Quadric(): a(1), b(1), c(1)
{
        d = b*b - 4*a*c;
}
 
Quadric::Quadric(double a_, double b_, double c_): a(a_), b(b_), c(c_)
{
        d = b*b - 4*a*c;
}
Неправильное использование оператора.
C++
1
2
3
4
5
bool Quadric::checkValidity()
{
        // Правильное использование оператора:
        return (((a) && (d>=0)) ? true : false);
}
Смешение стилей -- нехорошо.
%d для целого.
C++
1
2
3
4
5
6
7
char* Quadric::getResult()
{
        char *str = '\0';
        sprintf(str,"Answer: X1 = %f, X2 = %f\n",x1,x2);
 
        return str;
}
А дружественная функция объявлена правильно.

Добавлено через 43 секунды
#include "StdAfx.h" нужно запихать на самый верх.
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
19.12.2010, 20:54  [ТС]     Правильное оформление друж-х ф-й #3
Цитата Сообщение от lemegeton Посмотреть сообщение
Списки инициализации разделяются запятыми.
C++
1
2
3
4
5
6
7
8
9
10
// запятые разделяют списки инициализации
Quadric::Quadric(): a(1), b(1), c(1)
{
        d = b*b - 4*a*c;
}
 
Quadric::Quadric(double a_, double b_, double c_): a(a_), b(b_), c(c_)
{
        d = b*b - 4*a*c;
}
Неправильное использование оператора.
C++
1
2
3
4
5
bool Quadric::checkValidity()
{
        // Правильное использование оператора:
        return (((a) && (d>=0)) ? true : false);
}
Смешение стилей -- нехорошо.
%d для целого.
C++
1
2
3
4
5
6
7
char* Quadric::getResult()
{
        char *str = '\0';
        sprintf(str,"Answer: X1 = %f, X2 = %f\n",x1,x2);
 
        return str;
}
А дружественная функция объявлена правильно.

Добавлено через 43 секунды
#include "StdAfx.h" нужно запихать на самый верх.
Так вот, в StdAfx.cpp лежит описание ф-ций, но не работает, говорит , что к приватным членам нет доступа
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.12.2010, 21:27     Правильное оформление друж-х ф-й #4
Цитата Сообщение от alexsvk Посмотреть сообщение
#include "Quadric.h"
А что у тебя в файле Quadric.h?

StdAfx это прекомпилированный заголовок. Ты понимаешь, как он работает?
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
19.12.2010, 21:29  [ТС]     Правильное оформление друж-х ф-й #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Quadric.h
 
 
class Quadric  
{
        double a, b, c;
        double d, x1, x2;
public:
        Quadric();
        Quadric(double, double, double);
        virtual ~Quadric();
        friend istream& operator >>(istream&, Quadric&);
        friend ostream& operator <<(ostream&, Quadric&);
        bool checkValidity();
        void solve();
        char* getResult();
 
 
};
Говоря по-простому, через этот файл подключаются файлы библиотек и проекта на раннем связывании, так?
lemegeton
 Аватар для lemegeton
2909 / 1338 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
19.12.2010, 21:40     Правильное оформление друж-х ф-й #6
Структура проекта:
1. Файл StdAfx.h -- пустой.
2. Файл Quadric.h -- только описание класса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef _QUADRIC_H_ // защита от повторного включения
#define _QUADRIC_H_
#include <iostream>
using namespace std;
 
class Quadric  
{
        double a, b, c;
        double d, x1, x2;
public:
        Quadric();
        Quadric(double, double, double);
        virtual ~Quadric();
        friend istream& operator >>(istream&, Quadric&);
        friend ostream& operator <<(ostream&, Quadric&);
        bool checkValidity();
        void solve();
        char* getResult();
 
 
};
#endif // конец защиты от повторного включения
3. Quadric.cpp -- только реализация класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "Quadric.h"
#include <iostream>
using namespace std;
 
Quadric::Quadric(): a(1), b(1), c(1)
{
        d = b*b - 4*a*c;
}
 
Quadric::Quadric(double a_, double b_, double c_): a(a_), b(b_), c(c_)
{
        d = b*b - 4*a*c;
}
// и все остальные
4. Файл с главной функцией.
C++
1
2
3
4
5
6
7
8
9
#include "StdAfx.h"
#include "Quadric.h"
...
 
int main()
{
   ...
   return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.12.2010, 22:15     Правильное оформление друж-х ф-й
Еще ссылки по теме:

Не правильное вычисление C++
Правильное swprintf, правильное wprintf ? C++
Правильное объявление функции C++

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

Или воспользуйтесь поиском по форуму:
alexsvk
8 / 8 / 1
Регистрация: 15.07.2010
Сообщений: 255
19.12.2010, 22:15  [ТС]     Правильное оформление друж-х ф-й #7
http://2file.net/get/16520/
Пароль: 1992
Здесь программа. Взгляните.

Добавлено через 22 минуты
У Вас работает?
Yandex
Объявления
19.12.2010, 22:15     Правильное оформление друж-х ф-й
Ответ Создать тему
Опции темы

Текущее время: 13:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru