C++ (Qt)#include <QApplication>#include "shape.h"#include "rectangle.h"#include "viewer.h"#include <utility>#include <iostream>#include <memory> int main(int argc, char *argv[]){ QApplication a(argc, argv); Viewer viewer; viewer.resize(400, 200); std::shared_ptr<myShapes::Shape> pr1(new myShapes::Rectangle(100.0, 25.0)); std::shared_ptr<myShapes::Shape> pr2(new myShapes::Rectangle(100.0, 25.0)); std::shared_ptr<myShapes::Shape> pr3(new myShapes::Rectangle(100.0, 25.0)); std::shared_ptr<myShapes::Shape> pr4(new myShapes::Rectangle(100.0, 25.0)); viewer.addForPainting(pr1); viewer.addForPainting(pr2); viewer.addForPainting(pr3); viewer.addForPainting(pr4); viewer.show(); return a.exec();}
C++ (Qt)#ifndef VIEWER_H#define VIEWER_H #include <QGLWidget>#include "shape.h" #include <vector>#include <memory> class Viewer : public QGLWidget{public: Viewer(QWidget *pwgt = 0); void addForPainting(std::shared_ptr<myShapes::Shape> ps) { m_pshapes.push_back(ps); } protected: virtual void initializeGL(); virtual void resizeGL(int nWidth, int nHeight); virtual void paintGL(); private: std::vector<std::shared_ptr<myShapes::Shape> > m_pshapes; void draw(std::shared_ptr<myShapes::Shape> ps, int xOffset, int yOffset);}; #endif // VIEWER_H
C++ (Qt)#include "viewer.h"#include <utility>#include <QDebug> Viewer::Viewer(QWidget* pwgt) : QGLWidget(pwgt){} void Viewer::draw(std::shared_ptr<myShapes::Shape> ps, int xOffset, int yOffset){ glPointSize(2.0); glBegin(GL_LINE_LOOP); glColor3f(0.0, 0.0, 0.0); for (int i = 0; i < ps->amountOfPoints(); ++i) { std::pair<int, int> point = ps->point(i);// qDebug() << "x = " << point.first << "; xOffset = " << xOffset;// qDebug() << "y = " << point.second << "; yOffset = " << yOffset; int x = point.first + xOffset; int y = point.second + yOffset; glVertex2f(x, y); }// qDebug() << ""; glEnd();} /*virtual*/ void Viewer::initializeGL(){ qglClearColor(Qt::white);} /*virtual*/ void Viewer::resizeGL(int nWidth, int nHeight){ glMatrixMode(GL_PROJECTION); glLoadIdentity(); glViewport(0, 0, (GLint)nWidth, (GLint)nHeight); glOrtho(0, 400, 200, 0, -1, 1);} /*virtual*/ void Viewer::paintGL(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); int xGeneralOffset = 50; int yGeneralOffset = 100; int xOffset = 0; int yOffset = 0; for (std::size_t i = 0; i < m_pshapes.size(); ++i) { if (( (i+1) % 2) != 0) { // Odd, one-based xOffset = xGeneralOffset; yOffset += yGeneralOffset; } else { xOffset = xGeneralOffset + 150; } if (i == 0 || i == 1) { yOffset = 50; } draw(m_pshapes[i], xOffset, yOffset); }}
C++ (Qt)#ifndef RECTANGLE_H#define RECTANGLE_H #include "shape.h" namespace myShapes { class Rectangle : public Shape{public: Rectangle(double width = 0.0, double height = 0.0) : m_height(height), m_width(width) { addPoint(0, 0); addPoint(width, 0); addPoint(width, height); addPoint(0, height); } static double perimeter(double height, double width) { return 2.0 * (height + width); } static double area(double height, double width) { return height * width; } virtual double perimeter() const { return perimeter(m_height, m_width); } virtual double area() const { return area(m_height, m_width); } inline double height() const { return m_height; } inline double width() const { return m_width; } inline void setHeight(double height) { m_height = height; } inline void setWidth(double width) { m_width = width; } private: double m_height; double m_width;}; } #endif // RECTANGLE_H
C++ (Qt)#ifndef SHAPE_H#define SHAPE_H #include <vector>#include <utility> namespace myShapes { class Shape{public: Shape() { } virtual ~Shape() { } virtual double perimeter() const = 0; virtual double area() const = 0; inline void setPoinstSize(int pointSize = 2) { m_pointSize = pointSize; } inline int pointSize() const { return m_pointSize; } std::pair<int, int> point(int index) const { return m_points[index]; } int amountOfPoints() { return m_points.size(); } protected: void addPoint(int x, int y) { m_points.push_back(std::make_pair(x, y)); } private: int m_pointSize; std::vector<std::pair<int, int> > m_points;}; } #endif // SHAPE_H
C++ (Qt)#include <QCoreApplication>#include <string>#include <iostream> //---------------------------------------------------------------class CompanyA {public: // ... void sendClearText(const std::string& msg); void sendEncryptedText(const std::string& msg); // ...}; void CompanyA::sendClearText(const std::string& msg) { std::cout << "sendClearText of CompanyA: " << msg << std::endl;} void CompanyA::sendEncryptedText(const std::string& msg) { std::cout << "sendEncryptedText of CompanyA: " << msg << std::endl;} //---------------------------------------------------------------class CompanyB {public: // ... void sendClearText(const std::string& msg); void sendEncryptedText(const std::string& msg); // ...}; void CompanyB::sendClearText(const std::string& msg) { std::cout << "sendClearText of CompanyB: " << msg << std::endl;} void CompanyB::sendEncryptedText(const std::string& msg) { std::cout << "sendEncryptedText of CompanyB: " << msg << std::endl;} //---------------------------------------------------------------// этот класс не представляет функции sendCleartextclass CompanyZ {public: // ... void sendEncrypted(const std::string& msg); // ...}; void CompanyZ::sendEncrypted(const std::string& msg) { std::cout << "sendEncryptedText of CompanyZ: " << msg << std::endl;} //---------------------------------------------------------------// полная специализация MsgSender; отличается от общего шаблона// только отсутствием функции sendCleartexttemplate <>class MsgSender<CompanyZ> {public: // ... void sendSecret(const MsgInfo& info) { std::string msg; // создать msg из info msg = info.msg + " " + msg; CompanyZ c; c.sendEncrypted(msg); }}; //---------------------------------------------------------------// классы для других компаний// ... //---------------------------------------------------------------// класс, содержащий информацию, используемую для создания сообщенияclass MsgInfo {public: std::string msg;}; //---------------------------------------------------------------template <typename Company>class MsgSender {public: // конструктор, деструктор и т. п. // ... void sendClear(const MsgInfo& info) { std::string msg; // создать msg из info msg = info.msg + " " + msg; Company c; c.sendClearText(msg); } // аналогично sendClear, но вызывает c.sendEncrypted(msg) void sendSecret(const MsgInfo& info) { std::string msg; // создать msg из info // ... Company c; c.sendEncrypted(msg); }}; //---------------------------------------------------------------template <typename Company>class LoggingMsgSender: public MsgSender<Company> {public: // второй способ (см. о чём идёт речь ниже) // сообщает компилятору о том, что // sendClear есть в базовом классе //using MsgSender<Company>::sendClear; // ... void sendClearMsg(const MsgInfo& info) { // записать в протокол перед отправкой; std::cout << "It is written in protocol before sending" << std::endl; // вызвать функцию из базового класса // этот код не будет компилироваться, так как в шаблонных классах // компилятор не ищет в базовом // sendClear(info); // первый способ: чтобы код компилировался нужно написать: this->sendClear(info); // второй способ: using MsgSender<Company>::sendClear; // sendClear(info); // третий способ: явно указать, что // вызываемая функция находится в базовом классе: // MsgSender<Company>::sendClear(info); // примечание: но этот способ хуже прочих, посколько если // вызываемая функция виртуальна, то явная квалификация // отключает динамическое связывание. // записать в протокол после отправки; std::cout << "It is written in protocol after sending" << std::endl; } // ...}; //---------------------------------------------------------------int main(int argc, char *argv[]){ QCoreApplication a(argc, argv); MsgInfo msginfo; msginfo.msg = "Heloooo!"; MsgSender<CompanyA> msgSender; msgSender.sendClear(msginfo); return a.exec();}
C++ (Qt)//---------------------------------------------------------------// полная специализация MsgSender; отличается от общего шаблона// только отсутствием функции sendCleartexttemplate <>class MsgSender<CompanyZ> {public: // ... void sendSecret(const MsgInfo& info) { std::string msg; // создать msg из info msg = info.msg + " " + msg; CompanyZ c; c.sendEncrypted(msg); }};
C++ (Qt)#include <QApplication>#include "shape.h"#include "rectangle.h"#include "circle.h"#include "triangle.h"#include "viewer.h"#include <memory> int main(int argc, char *argv[]){ QApplication a(argc, argv); Viewer viewer; viewer.resize(400, 200); std::shared_ptr<myShapes::Shape> pt(new myShapes::Triangle(30.0, 50.0)); std::shared_ptr<myShapes::Shape> pr2(new myShapes::Rectangle(100.0, 25.0)); std::shared_ptr<myShapes::Shape> pr3(new myShapes::Rectangle(100.0, 25.0)); std::shared_ptr<myShapes::Shape> pc(new myShapes::Circle(50.0)); viewer.addForPainting(pt); viewer.addForPainting(pc); viewer.addForPainting(pr2); viewer.addForPainting(pr3); viewer.show(); pc->setRadius(25.0); return a.exec();}