よもやまのC#時折CPP

MFC,C# .Net,CPP,and ....

目次

Blog 利用状況

ニュース

わんくま同盟

わんくま同盟

投稿カレンダー

iKnow始めました

書庫

日記カテゴリ

親戚は、友達の関係なのか?(C++ 内包とfriendクラス)

ついに親戚がプレゼントを配りはじめたようです。
CPropertySheetとCPropertyPageの関係を説明できるまで、まだまだ先が長そうな気配・・
#そして、色々と突っ込まれる予感・・

#include "stdafx.h"

class Oya {
public:
 Oya(){};
 ~Oya(){};
 virtual void Speak();
 virtual void Present();
};

void Oya::Speak()
{
 std::string data( "Oya");
 std::cout << data.c_str() << std::endl;
}

void Oya::Present()
{
 std::string data( "Save the Money!");
 std::cout << data.c_str() << std::endl;
}

class Ko:public Oya {
public:
 Ko(){};
 ~Ko(){};
 void Speak();
 void Present();
};

void Ko::Speak()
{
 std::string data( "Ko");
 std::cout << data.c_str() << std::endl;
}

void Ko::Present()
{
 std::string data( "I want to buy the \"Wii!!\"");
 std::cout << data.c_str() << std::endl;
}

class ShinSeki :public Oya{
protected:
 std::vector<Oya*> m_Oyas;
public:
 ShinSeki() {};
 ~ShinSeki(){};
 //
 void AddPresentKo(Oya* pOya) {
  m_Oyas.push_back( pOya);
 }
 //
 void Present()
 {
  std::vector<Oya*>::iterator iteOyako;
  iteOyako = m_Oyas.begin();
  while( iteOyako != m_Oyas.end() ) {
   Oya* pItazura = *iteOyako;
   pItazura->Present();
   iteOyako++;
  }
 }
 void Speak();
 //
 friend class Oya;
 friend class Ko;
};

void ShinSeki::Speak()
{
 Oya::Speak();
 std::string data( "Shinseki");
 std::cout << data.c_str() << std::endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
 Oya* pData[10];
 ShinSeki Shinzoku;
 int nIndex = 0, nCnt;
 
 pData[nIndex++] = new Oya();
 pData[nIndex++] = new Ko();
 //pData[nIndex++] = new ShinSeki();
 pData[nIndex++] = &Shinzoku;
 for( nCnt = 0; nCnt < nIndex; nCnt++) {
  pData[nCnt]->Speak();
 }
 Shinzoku.AddPresentKo( new Oya() );
 Shinzoku.AddPresentKo( (Oya*)pData[0] );
 Shinzoku.AddPresentKo( (Oya*)pData[1] );
 Shinzoku.AddPresentKo( (Oya*)new Ko() );
 Shinzoku.Present();
 //
 for( nCnt = 0; nCnt < nIndex -1; nCnt++) {
  delete pData[nCnt];
 }
 return 0;
}

投稿日時 : 2007年11月19日 22:54

コメントを追加

# re: 親戚は、友達の関係なのか?(C++ 内包とfriendクラス) 2007/11/19 23:41 lol

AddPresentKo()にShinSekiを渡すとどうなる?

無限再帰···

# re: 親戚は、友達の関係なのか?(C++ 内包とfriendクラス) 2007/11/20 10:15 uskz

細かい所をいろいろ突っ込ませていただきます

>~Oya(){};
>Oya* pData[10];
>delete pData[nCnt];
基底クラスへのポインタを通じてオブジェクトをdeleteするときデストラクタが非仮想だとその動作は未定義(5.3.5¶3)

>std::cout << data.c_str() << std::endl;
std::stringに対するoperator<<があるのでc_str()は無意味(21.3.7.9¶4)

>iteOyako++;
このインクリメントは前置にすべき.と言うかそもそも自分でループは書かない方がいい.
std::for_each(m_Oyas.begin(), m_Oyas.end(), std::mem_fun(&Oya::Present));

あとオブジェクトの論理的な不変性を維持するメンバ関数はconstにすべき.

# re: 親戚は、友達の関係なのか?(C++ 内包とfriendクラス) 2007/11/20 21:26 よもやま

lolさん、ご指摘ありがとうございます。
>AddPresentKo()にShinSekiを渡すとどうなる?
>
>無限再帰・・・
そのとおりです。

uskzさん、ご指摘ありがとうございます。
>~Oya(){};
>Oya* pData[10];
>delete pData[nCnt];
>基底クラスへのポインタを通じてオブジェクトをdeleteするときデストラクタが非仮想だとその動作は未定義(5.3.5¶3)
ご指摘の通りです。virtual ~Oya() {};ですね。

>std::cout << data.c_str() << std::endl;
std::stringに対するoperator<<があるのでc_str()は無意味(21.3.7.9¶4)
Visual Studio 2005にて、プロジェクトプロパティ
「文字セット」項目を
1.Unicode 文字セットを使用する
2.マルチ バイト文字セットを使用する
3.設定なし
のみを変更しリビルドしましたが
コンパイルエラーがでますのでこちらの表記を使用しております。
(下名プロジェクトのプロパティ設定でミスがあるかもしれませんので
このあたりは調査いたします。)
今後掲載するブログにはコンパイル環境等も併せて記述するよう致します。
また、cygwin等の環境も用意し検証するよう致します。

# re: 親戚は、友達の関係なのか?(C++ 内包とfriendクラス) 2007/11/20 21:30 よもやま

> >iteOyako++;
> このインクリメントは前置にすべき.と言うかそもそも自分でループは書かない方がいい.
> std::for_each(m_Oyas.begin(), m_Oyas.end(), std::mem_fun(&Oya::Present));
>
> あとオブジェクトの論理的な不変性を維持するメンバ関数はconstにすべき.
この点気づきませんでした。ありがとうございます。

タイトル  
名前  
URL
コメント