crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Задачка по С++, Придумал тут намедни задачку, как вам?
ViGOur
  опции профиля:
сообщение 19.6.2017, 11:07
Сообщение #1


Мастер
******

Группа: Модератор
Сообщений: 3276
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 220 раз(а)




Репутация:   40  


Есть классы:
Исходный код классов
#include <sstream>
#include <iostream>
#include <string>
#include <vector>

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

public:
    enum eProperties
    {
        PRPT_END
    };
};

class CMsg0: public CClassMessage
{
public:
    enum eProperties
    {
        PRPT_Prefix = 0,
        PRPT_Name,
        PRPT_END
    };
};

class CMsg1: public CClassMessage
{
public:
    enum eProperties
    {
        PRPT_Prefix = 0,
        PRPT_State,
        PRPT_Protocol,
        PRPT_END
    };
};
Сделайте так, что функция работала правильно:
bool parseLine( std::vector<std::string> line)
    {
        if( line.size() >= m_properties.size() )
        {
            for( int n = 0; n < PRPT_END; ++n )
            {
                m_properties[n] = line[n];
            }
            return true;
        }
        return false;
    }
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.6.2017, 8:35
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2809
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 191 раз(а)




Репутация:   34  


ViGOur, начнём с того, что означает "правильно" - а что должна делать функция ? ) Может, она уже правильно работает ?

Допустим, под "правильно" имеется в виду определение значения PRPT_END в СТАТИЧЕСКОЙ функции
bool parseLine(CClassMessage* context, std::vector<std::string> line)

для переданного контекста (объекта класса CClassMessage или его потомка)


Раскрывающийся текст
тут вариантов несколько
1) "enum eProperties" всех классов заменить на мембер std::map<int> CClassMessage::m_props; и заполнить в конструкторе потомков
2) виртуальная функция CClassMessage::GetPropsCount
3) можно удариться в шаблоны, но тут лишнее
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 21.6.2017, 15:48
Сообщение #3


Мастер
******

Группа: Модератор
Сообщений: 3276
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 220 раз(а)




Репутация:   40  


В принципе вопрос правильный! :)

Заменить enum на map не стоит, хотябы потому, что в каждом классе свои свойства, которые описываются в enum, к тому же как быт, если нужно обращение вроде: m_properties[PRPT_Name] ? Хардкодить - не по феншую...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 22.6.2017, 9:09
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2809
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 191 раз(а)




Репутация:   34  


ViGOur, так в конструкторе каждого класса мап заполнится своими свойствами

если нужно обращение "m_properties[PRPT_Name]", то напишут "m_properties[PRPT_Name]" ))

если нужно запретить изменение - вернуть константную ссылку на мап
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 24.6.2017, 17:47
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3276
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 220 раз(а)




Репутация:   40  


а ты проверь! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.6.2017, 7:55
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2809
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 191 раз(а)




Репутация:   34  


ViGOur, не понял вопрос )

что именно нужно проверить ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 27.6.2017, 10:31
Сообщение #7


Мастер
******

Группа: Модератор
Сообщений: 3276
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 220 раз(а)




Репутация:   40  


Ну а ты сделай по тем классам что описаны в первом посте примерно так:
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 );
и посмотри какие свойства будет у каждого объекта! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 27.6.2017, 16:54
Сообщение #8


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 108 раз(а)




Репутация:   8  


: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;
};
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 29.6.2017, 10:49
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 65 раз(а)




Репутация:   17  


Цитата(lanz @ 27.6.2017, 16:54) *
:p

А зачем дважды слова public? :) Одного раза, на мой взгляд, достаточно! ;))))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 29.6.2017, 18:24
Сообщение #10


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 108 раз(а)




Репутация:   8  


Цитата
Одного раза, на мой взгляд, достаточно!

Это паттерн "паблик морозов" :) Для отладки запилил, да и забыл поменять.
Ну и вообще иногда использую для логического разделения и чтобы не забываить что все еще паблик. Например конструкторы под своим пабликом потом интерфейс 1, потом второй и т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 16.1.2018, 16:49