Есть классы:
#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;
}
ViGOur, начнём с того, что означает "правильно" - а что должна делать функция ? ) Может, она уже правильно работает ?
Допустим, под "правильно" имеется в виду определение значения PRPT_END в СТАТИЧЕСКОЙ функции
bool parseLine(CClassMessage* context, std::vector<std::string> line)
В принципе вопрос правильный!
Заменить enum на map не стоит, хотябы потому, что в каждом классе свои свойства, которые описываются в enum, к тому же как быт, если нужно обращение вроде: m_properties[PRPT_Name] ? Хардкодить - не по феншую...
ViGOur, так в конструкторе каждого класса мап заполнится своими свойствами
если нужно обращение "m_properties[PRPT_Name]", то напишут "m_properties[PRPT_Name]" ))
если нужно запретить изменение - вернуть константную ссылку на мап
а ты проверь!
ViGOur, не понял вопрос )
что именно нужно проверить ?
Ну а ты сделай по тем классам что описаны в первом посте примерно так:
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 );
и посмотри какие свойства будет у каждого объекта!
#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;
};
Хорошо lanz, , а теперь как можно избавиться от virtual std::size_t PRPT_END() const;.
Но зачем? Это же полностью изоморфно. В 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;
};
Нельзя, в этом случае у испытуемого включаются мозги (если включаются) и ты смотришь, как он умеет мыслить!
Нуу, с плюсами так опасно, может вылезти какая то хтоничная фича про которую никто не слышал
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)