C ++访问基类

时间:2015-07-05 13:36:29

标签: c++ composition private-members object-composition

因为我是C ++的新手,所以就这样了!

我有一个基类(我没有在任何地方使用继承)和两个其他类的对象。我需要从私人成员访问另一个类中的另一个。

class base
{
private:
    myClass1 m1;
    myClass2 m2;
public:
    base() {};
    ~base() {};
};

class myClass1
{
private:
    int m_member1;
public:
    myClass1() {};

    ~myClass1() {};
};

class myClass2
{
private:
    int m_member2;
public:
    myClass2() {};

    ~myClass2() {};

    int sum_members_because_yes(void)
    {
        return (myClass1::m_member1 + m_member2); //HOW CAN I DO THIS???
    }
};

如何从myClass2中的myClass1访问m_member1?:)

(我想避免继承,因为在我的代码中myClass1和2不是基类...)

由于

2 个答案:

答案 0 :(得分:1)

我不清楚你想要达到的目标。我认为能够有两个类在另一个类中保存数据,并且有一个函数返回两个类数据的某种组合。我会用以下方式做到这一点:

 <!DOCTYPE html>
             <html>
             <head>
             <meta charset='utf-8' />
             <link href='../fullcalendar/fullcalendar.css' rel='stylesheet' />
             <link href='../fullcalendar/fullcalendar.print.css' rel='stylesheet' media='print' />
             <script src='../lib/moment.min.js'></script>
             <script src='../lib/jquery.min.js'></script>
             <script src='../fullcalendar/fullcalendar.min.js'></script>
             <script type='text/javascript' src='gcal.js'></script>

         <script> 
        var calenderNo=1;
            $(document).ready(function() {
              $('‪#‎calendar1‬').fullCalendar({
                  googleCalendarApiKey: 'xxxxxxxxxxxxxxxxxxx',
                     events: {
                      googleCalendarId: 'xxxxxxxxxxxxxxxxxxx'
                     }
              });
              $('‪#‎calendar2‬').fullCalendar({
                  googleCalendarApiKey: 'xxxxxxxxxxxxxxxxx',
                     events: {
                        googleCalendarId: 'xxxxxxxxxxxxxxxx'
                      }
               });
               $('‪#‎calendar3‬').fullCalendar({
                  googleCalendarApiKey: 'xxxxxxxxxxxxxxx',
                     events: {
                        googleCalendarId: 'xxxxxxxxxxxxxxx'
                     }
                  });
         setInterval(function(){
              $('#calendar'+calenderNo++).hide();
              if(calenderNo==4)
    calenderNo=1;
    $('#calendar'+calenderNo).show();

            });
            </script>
           <style>
            body {
              margin: 40px 10px;
              padding: 0;
             }
             #calendar1 {
               max-width: 900px;
               margin: 0 auto;
             }
             #calendar2 {
                max-width: 900px;
                margin: 0 auto;
                display:none;
              }
              #calendar3 {
                max-width: 900px;
                margin: 0 auto;
                display:none;
               }

             </style>
             </head>
             <body>
              <div id='calendar1'></div>
              <div id='calendar2'></div>
              <div id='calendar3'></div>
             </body>
            </html>

这里我们有两个类(B和C),它们包含数据,然后是类A,它具有类型B和C的成员。返回总和的函数应该是类A的方法,因为它包含B和C的实例数据类的私有数据是通过getter访问的,这允许访问数字,但不能更改它的值。在我的例子中,B和C类是相同的。如果两个对象是同一个“事物”的两个实例,那么它们应该是同一个类的两个实例,而不是不同的类。我希望我已经回答了正确的问题。

答案 1 :(得分:1)

有很多方法可以做到。

要允许访问m_member1,您可以公开m_member1。或者您可以声明friend myClass1的内容,如下所示:

class myClass1
{
private:
  int m_member1;
  ...
  friend class base;
};

或者这个:

class myClass1
{
private:
  int m_member1;
  ...
  friend class myClass2;
};

或者这个:

class myClass1
{
private:
  int m_member1;
  ...
  friend class int myClass2::sum_members_because_yes(void);
};

或者你可以给myClass1一个公共访问者:

class myClass1
{
  ...
public:
  ...
  int get_m_member1() const
  {
    return(m_member_1);
  }
};

然后,为了让m2到达m1,您可以m2指向m1

class myClass2
{
  ...
public:
  myClass1 *pm1;
};

class base
{
  ...
public:
  base()
  {
    m2.pm1 = &m1;
  };
};

或者您可以根据m_member1的请求在m2中传递sum_members_because_yes的值,但这个答案会变得很长。

(一旦您对所有这些感到满意,您应该注意base确实属于-- I suggest you to modify the table. Here is updated table structure -- -- Table structure for table `reminder` -- CREATE TABLE `reminder` ( `id` int(11) NOT NULL auto_increment, `title` varchar(255) NOT NULL, `startdate` datetime NOT NULL, `enddate` date NOT NULL, `kind` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; -- -- Dumping data for table `reminder` -- INSERT INTO `reminder` (`id`, `title`, `startdate`, `enddate`, `kind`) VALUES (1, 'This is reminder', '2015-06-03 19:25:44', '2015-07-21', 'weekly'); -- Query data get results for 2015-06-17 from `reminder` table SELECT CONCAT_WS(' ','2015-06-17',TIME(startdate)) AS ReminderDateTime, title FROM reminder WHERE IF( kind='daily', ((UNIX_TIMESTAMP('2015-06-17') -UNIX_TIMESTAMP(DATE(startdate))) % (1*24*60*60)=0) , IF( kind='weekly', ((UNIX_TIMESTAMP('2015-06-17') -UNIX_TIMESTAMP(DATE(startdate))) % (7*24*60*60)=0) , IF( kind='monthly', DAYOFMONTH('2015-06-17')=DAYOFMONTH(startdate), IF( kind='quarterly', ((UNIX_TIMESTAMP('2015-06-17') -UNIX_TIMESTAMP(DATE(startdate))) % (91*24*60*60)=0) , IF( kind='yearly', DAYOFYEAR('2015-06-17')=DAYOFYEAR(startdate), IF( kind='', startdate, '0000-00-00 00:00:00' ) ) ) ) ) ) AND DATE(startdate) <='2015-06-17' AND IF(enddate<>'0000-00-00',enddate>='2015-06-17','1') ORDER BY ReminderDateTime ASC 。)