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

Совместимость типов - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти ошибку http://www.cyberforum.ru/cpp-beginners/thread69860.html
#include<iostream.h> #include<conio.h> #include<string.h> using namespace std; void main() {string s; int p,k,i,sk=0,sk2=0,sk3=0,sk4=0,sk5=0,sk6=0; double avg; cout<<"Koli4estvo stro4ek: ";cin>>k; for (i=1;i<=k;i++)
C++ ошибки Помогите найти ошибки в программе: Нужна помощь не могу найти ошибку с/с++ #include <stdio.h> #include <conio.h> #include <math.h> void main (void){ clrscr (); printf("LW#1"); http://www.cyberforum.ru/cpp-beginners/thread69859.html
2мерный массив C++
Привет всем. Помогите пожалуйста решить нетрудную задачу.Заранее спасибо. (если можно рабочую версию) Дан двумерный массив. Считать что из его строк нулевая. Удалить эту строку и сдвинуть все строки.
перевод программы C++
Заданы своими координатами N точек на плоскости и два круга ради¬у¬са¬ми R1 и R2 (R1 < R2) с центром в начале координат. Определить, сколько точек на¬ходится одновременно в обоих кругах и сколько вне их. Var R1,R2 : real; {Радиус окpужностей} N,i,k1,k2 : word; p1,p2 : boolean; {Пеpеменные логического типа} x,y : real; {Кооpдинаты точек} Begin Write('Введите...
C++ Указатели+массив. чуть подправить http://www.cyberforum.ru/cpp-beginners/thread69832.html
Введите с клавиатуры данные в массив целого типа, а затем выведите на экран их среднее значение. тема:указатели Программа работает, но ответ выдаёт не правильный. ошибается в вычислениях среднего значения. #include <stdio.h> void main() {
C++ одномерный Массив В одномерном массиве В состоящем из N целых элементов, вычислить: a) количество элементов, равных по значению первому элементу; b) произведение элементов из промежутка . подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
05.12.2009, 00:02     Совместимость типов
Если вместо "общий интерфейс" сказать "универсальный интерфейс", это много информации не добавит. Доступны ли исходники библиотек? Возможно ли их совместное использование (т.е. не возникает ли конфликта имён)? Подойдёт ли возможность использовать один из этих классов в качестве основного? Содержит ли другой класс достаточно информации для создания основного?
Если ответ на все вопросы утвердительный, то можно использовать преобразующий конструктор. Допустим, ты хочешь иметь возможность неявно превращать объекты типа Vector3dF в Vector3dD:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Vector3dF{
public:
    Vector3dF(float x, float y, float z): X(x), y(Y), Z(z) {}
    float Len() const {return sqrt(X*X + Y*Y + Z*Z);}
    float X, Y, Z;
};
 
class Vector3dD{
public:
    Vector3dD(double x, double y, double z): X(x), y(Y), Z(z) {}
    double Len() const {return sqrt(X*X + Y*Y + Z*Z);}
    double X, Y, Z;
    // Преобразующий конструктор
    Vector3dD(const Vector3dF &vec): X(vec.X), Y(vec.Y), Z(vec.Z) {}
};
С таким конструктором ты можешь смело подставлять значения типа Vector3dF в места, где требуется Vector3dD:
C++
1
2
3
4
5
6
7
Vector3dD Neg(Vector3dD vec)
{
    return Vector3dD(-vec.X, -vec.Y, -vec.Z);
}
 
Vector3dF vf(1.2f, 1.4f, 1.6f);
Vector3dD vd = Neg(vf);
Во втором случае создаёшь класс-интерфейс Vector3d, с которым и будешь работать через виртуальные функции:
C++
1
2
3
4
5
class Vector3d{
public:
    virtual double Len() const = 0;
    virtual ~Vector3d() {};
};
. Потом создаёшь потомки, которые содержат ссылки или экземпляры Vector3dF и Vector3dD и реализуют заданный интерфейс, просто обращаясь к соответствующим функциям. Они тоже могут использовать порождающие конструкторы, а обращаться к Vector3d надо будет по указателям или по ссылке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class WrapperF: public Vector3d {
public:
    WrapperF(const Vector3dF &src): vec(src) {}
    virtual double Len() const {return vec.Len();}
private:
    Vector3dF vec;
};
 
class WrapperD: public Vector3d {
public:
    WrapperD(const Vector3dD &src): vec(src) {}
    virtual double Len() const {return vec.Len();}
private:
    Vector3dD vec;
};
 
double NegLen(const Vector3d& vec)
{
    return -vec.Len();
}
 
Vector3dF vf(1.2f, 1.4f, 1.6f);
const double nl = NegLen(WrapperF(vf));
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru