2010-06-12 3 views
0

Я только что переехал из C в C++ и теперь работает со списками. У меня есть класс под названием «сообщение», и мне нужно иметь класс под названием «строка», , который должен иметь список сообщений в своих свойствах. как я узнал, свойства объекта должны быть инициализированы в списке инициализации конструктора, и у меня было «желание» инициализировать список сообщений в дополнение к остальным свойствам (некоторые строки и удвоения). что «побуждение» оправдано? нужно ли инициализировать список?инициирование списков в списке инициализации конструктора

вот мой код.
цель состоит в том, чтобы создать пустой список строк, и конструктор, я говорю о том, является один в line.cpp

//------------------- 
//Code for line.h: 
//------------------- 

#ifndef LINE_H_ 
#define LINE_H_ 

#include "message.h" 
#include <string> 
#include <list> 
using namespace std; 

namespace test 
{ 
    using std::string; 

    class Line 
    { 
     public: 
      // constractor with parameters 
      Line(const string& phoneStr, double callRate, double messageRate); 

      //function to get phone string 
      string getPhoneStr() const; 

      double getCallRate() const; 

      double getMessageRate() const; 

      double getLastBill() const; 

      void addMessage(const string& phoneStr); 


     private: 
      string mPhoneStr; 
      list<Message> mMessages; 
      double mMessageRate; 
      double mLastBill; 
    }; 
} 

#endif /* LINE_H_ */ 


//------------------- 
//Code for line.cpp: 
//------------------- 

#include "line.h" 

namespace test 
{ 
    Line::Line(const string& phoneStr, double callRate, double messageRate) 
     : mPhoneStr(phoneStr), mCallRate(callRate), mMessageRate(messageRate), 
     mLastBill(0) {} 

    //getters: 

    string Line::getPhoneStr() const 
    { 
     return mPhoneStr; 
    } 

    double Line::getCallRate() const 
    { 
     return mCallRate; 
    } 

    double Line::getMessageRate() const 
    { 
     return mMessageRate; 
    } 

    double Line::getLastBill() const 
    { 
     return mLastBill; 
    } 


} 


//------------------- 
//Code for message.h: 
//------------------- 

#ifndef MESSAGE_H_ 
#define MESSAGE_H_ 

#include <string> 

namespace test 
{ 
    using std::string; 

    class Message 
    { 
     public: 
      // constractor with parameters 
      Message(const string& phoneStr); 

      //function to get phone string 
      string getPhoneStr() const; 

      //function to set new phone string 
      void setPhoneStr(const string& phoneStr); 


     private: 
      string mPhoneStr; 
    }; 
} 
#endif /* MESSAGE_H_ */ 

//----------------------------------------------------------------------- 

//--------------------- 
//code for message.cpp: 
//--------------------- 


#include "message.h" 

namespace test 
{ 

    Message::Message(const string& phoneStr) : mPhoneStr(phoneStr) {} 

    string Message::getPhoneStr() const 
    { 
     return mPhoneStr; 
    } 

    void Message::setPhoneStr(const string& phoneStr) 
    { 
     mPhoneStr = phoneStr; 
    } 

} 

ответ

0

Вы не должны делать все, что в списке инициализации. Трудно сказать, не видя какого-то кода, но похоже, что добавление сообщений было бы лучше сделано в теле конструктора.

+0

простите меня за отправку здесь, но я до сих пор не знаю, как работает этот сайт. как только я получу какой-то ответ, я удалю его из основного сообщения: это мой класс: http://pastebin.com/X9Y9j0bH. когда объявлено, строка должна иметь пустой список сообщений – bks

+0

@bks Не использовать pastebin - отправьте код как часть вашего вопроса. – 2010-06-12 09:12:10

+0

я вижу. теперь вставил весь код, надеюсь, что его достаточно ясно – bks

2

Список инициализации предназначен для инициализации любых базовых классов и переменных-членов. Тело конструктора предназначено для запуска любого другого кода, который вам нужен, прежде чем объект можно считать инициализированным.

Мне сложно понять вашу ситуацию, но, надеюсь, это помогает.

Смежные вопросы