スポンサーリンク

このドキュメントの内容は、以下の通りです。

C++言語で「メンバに参照を持つクラス」をメンバに持つクラスを初期化する方法について。

C はデータクラスです。
X は、C の参照をメンバに持つクラスです。
Y は、X をメンバに持つクラスです。
Y は、X のために、C もメンバに持ちます。

X のコンストラクタは、C の参照を受け取ります。
これを値渡しにするとデストラクタが起動されて、意味不明なことになります。だから、参照が渡されるように & を忘れてはいけません。

#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

class C
{
public:
	string progname;
	string conf;
	C (string p, string c) : progname (p), conf (c)
	{
		cout << __PRETTY_FUNCTION__ << endl;
		//cout << progname << endl;
		//cout << conf << endl;
	}

	~C () {
		cout << __PRETTY_FUNCTION__ << endl;
	}

	C (const C& o) {
		cout << __PRETTY_FUNCTION__ << endl;
		progname = o.progname;
		conf = o.conf;
		//cout << progname << endl;
		//cout << conf << endl;
	}

	void p () {
		cout << __PRETTY_FUNCTION__ << endl;
		cout << progname << endl;
		cout << conf << endl;
	}
};

class X
{
	C &c;
public:
	X (C &c1) : c (c1) {
		cout << __PRETTY_FUNCTION__ << endl;
	}
	~X () {
		cout << __PRETTY_FUNCTION__ << endl;
	}
	void p ()
	{
		cout << __PRETTY_FUNCTION__ << endl;
		c.p ();
	}
};

class Y
{
	C c;
	X x;
public:
	Y ( string p, string conf ) : c(p,conf), x(c) {
		cout << __PRETTY_FUNCTION__ << endl;
	}

	~Y () {
		cout << __PRETTY_FUNCTION__ << endl;
	}
	void p () {
		cout << __PRETTY_FUNCTION__ << endl;
		x.p ();
	}
};

void t (char *argv[])
{
	string progname = argv[0];
	string conf	= "foo.conf";

	Y y ( progname, conf );

	y.p ();
}

int
main (int argc, char *argv[])
{

	t (argv);

	exit (EXIT_SUCCESS);
}

コンパイル


コンパイル方法は、以下の通り。

g++ foo.cc

実行例


プログラムを実行すると以下のようにクラスが作成され、破棄されます。
オブジェクトが作られた順番と逆に破棄されます。

C::C(std::string, std::string)
X::X(C&)
Y::Y(std::string, std::string)
void Y::p()
void X::p()
void C::p()
./a.out
foo.conf
Y::~Y()
X::~X()
C::~C()

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

スポンサーリンク
 

過去ログ

2020 : 01 02 03 04 05 06 07 08 09 10 11 12
2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー