crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Задачка по С++
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
lanz Дата 5.7.2017, 18:49
  Нуу, с плюсами так опасно, может вылезти какая то хтоничная фича про которую никто не слышал :lol:
ViGOur Дата 5.7.2017, 16:46
  Нельзя, в этом случае у испытуемого включаются мозги (если включаются) и ты смотришь, как он умеет мыслить! :)
lanz Дата 1.7.2017, 0:04
  Но зачем? Это же полностью изоморфно. В C++ для run-time полиморфизма есть только виртуальные функции. Разве можно без них?
Раскрывающийся текст
#include <sstream>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <iterator>



class CClassMessage
{
public:
    std::vector<std::string> m_properties;

    enum eProperties
    {
        PRPT_END
    };

public:
    template<typename T>
    bool parseLineImpl(std::vector<std::string> line)
    {
        if( line.size() >= m_properties.size() )
        {
            m_properties.resize(T::PRPT_END);
            for( int n = 0; n < T::PRPT_END; ++n )
            {
                m_properties[n] = line[n];
            }
            return true;
        }
        return false;
    }
    
    virtual bool parseLine(std::vector<std::string> line) {
        return CClassMessage::parseLineImpl<CClassMessage>(line);
    }
};

class CMsg0: public CClassMessage
{
public:
    enum eProperties
    {
        PRPT_Prefix = 0,
        PRPT_Name,
        PRPT_END
    };
    
    virtual bool parseLine(std::vector<std::string> line) {
        return CClassMessage::parseLineImpl<CMsg0>(line);
    }
};

class CMsg1: public CClassMessage
{
public:
    enum eProperties
    {
        PRPT_Prefix = 0,
        PRPT_State,
        PRPT_Protocol,
        PRPT_END
    };
    
    virtual bool parseLine(std::vector<std::string> line) {
        return CClassMessage::parseLineImpl<CMsg1>(line);
    }
};

int main() {
    std::vector<std::string> vec0 = { "prefix", "name"  };
    std::vector<std::string> vec1 = { "prefix", "state", "protocol" };
    
    CClassMessage *pMsg0 = new CMsg0();
    pMsg0->parseLine( vec0 );
    
    CClassMessage *pMsg1 = new CMsg1();
    pMsg1->parseLine( vec1 );
    std::cout << pMsg0->m_properties.size() << std::endl;
    std::cout << pMsg1->m_properties.size() << std::endl;
    
    std::copy(
        std::begin(pMsg0->m_properties),
        std::end(pMsg0->m_properties),
        std::ostream_iterator<std::string>(std::cout, ",")
    );
    std::cout << std::endl;
    std::copy(
        std::begin(pMsg1->m_properties),
        std::end(pMsg1->m_properties),
        std::ostream_iterator<std::string>(std::cout, ",")
    );
    
    return 0;
};
ViGOur Дата 30.6.2017, 12:54
  Хорошо lanz, , а теперь как можно избавиться от virtual std::size_t PRPT_END() const;.
:)

Цитата(AD @ 29.6.2017, 10:49) *
А зачем дважды слова public? :) Одного раза, на мой взгляд, достаточно! ;))))
А я так разделяю обычные и виртуальные методы! :)
lanz Дата 29.6.2017, 18:24
 
Цитата
Одного раза, на мой взгляд, достаточно!

Это паттерн "паблик морозов" :) Для отладки запилил, да и забыл поменять.
Ну и вообще иногда использую для логического разделения и чтобы не забываить что все еще паблик. Например конструкторы под своим пабликом потом интерфейс 1, потом второй и т.п.
AD Дата 29.6.2017, 10:49
 
Цитата(lanz @ 27.6.2017, 16:54) *
:p

А зачем дважды слова public? :) Одного раза, на мой взгляд, достаточно! ;))))
lanz Дата 27.6.2017, 16:54
  :p
Раскрывающийся текст
#include <sstream>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <iterator>



class CClassMessage
{
public:
    std::vector<std::string> m_properties;

    enum eProperties
    {
        ePRPT_END
    };

    virtual std::size_t PRPT_END() const {
        return CClassMessage::ePRPT_END;    
    };
public:
    bool parseLine(std::vector<std::string> line)
    {
        if( line.size() >= m_properties.size() )
        {
            m_properties.resize(PRPT_END());
            for( int n = 0; n < PRPT_END(); ++n )
            {
                m_properties[n] = line[n];
            }
            return true;
        }
        return false;
    }
};

class CMsg0: public CClassMessage
{
public:
    enum eProperties
    {
        PRPT_Prefix = 0,
        PRPT_Name,
        ePRPT_END
    };
    
       virtual std::size_t PRPT_END() const {
        return CMsg0::ePRPT_END;    
    };
};

class CMsg1: public CClassMessage
{
public:
    enum eProperties
    {
        PRPT_Prefix = 0,
        PRPT_State,
        PRPT_Protocol,
        ePRPT_END
    };
    
    virtual std::size_t PRPT_END() const {
        return CMsg1::ePRPT_END;    
    };
};

int main() {
    std::vector<std::string> vec0 = { "prefix", "name"  };
    std::vector<std::string> vec1 = { "prefix", "state", "protocol" };
    
    CClassMessage *pMsg0 = new CMsg0();
    pMsg0->parseLine( vec0 );
    
    CClassMessage *pMsg1 = new CMsg1();
    pMsg1->parseLine( vec1 );
    std::cout << pMsg0->m_properties.size() << std::endl;
    std::cout << pMsg1->m_properties.size() << std::endl;
    
    std::copy(
        std::begin(pMsg0->m_properties),
        std::end(pMsg0->m_properties),
        std::ostream_iterator<std::string>(std::cout, ",")
    );
    std::cout << std::endl;
    std::copy(
        std::begin(pMsg1->m_properties),
        std::end(pMsg1->m_properties),
        std::ostream_iterator<std::string>(std::cout, ",")
    );
    
    return 0;
};
ViGOur Дата 27.6.2017, 10:31
  Ну а ты сделай по тем классам что описаны в первом посте примерно так:
std::vector<std::string> vec0 = { "prefix", "name"  };
std::vector<std::string> vec1 = { "prefix", "state", "protocol" };

CClassMessage *pMsg0 = new CMsg0();
pMsg0->parseLine( vec0 );

CClassMessage *pMsg1 = new CMsg1();
pMsg1->parseLine( vec1 );
и посмотри какие свойства будет у каждого объекта! :)
Алексей1153 Дата 25.6.2017, 7:55
  ViGOur, не понял вопрос )

что именно нужно проверить ?
ViGOur Дата 24.6.2017, 17:47
  а ты проверь! :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 15:24