質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

6965閲覧

C++ リストをメンバ変数にもつクラスへの値の入れ方

sugar4006

総合スコア13

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/04/23 01:35

編集2016/04/23 02:12

こんにちは。現在C++の勉強中です。
リストがよくわからず、苦戦しております。
下記のような処理において、hogehogehogeクラスのhogelistの中に値を入れたいのですが、
どのような処理を追加していいのかわかりません。
hogeクラスに直接値をいれると自動的にhogehogehogeクラスのhogeリストにも
値が入るのかなと思い、下記のように書いてみましたがダメでした。

駄文で申し訳ございませんが、ご教示頂けると幸いです。

###該当のソースコード
//----------------------------------------------------------
//hogeクラス
//----------------------------------------------------------
class hoge
{
public:
hoge()
{
m_str1.Empty();
m_str2.Empty();
}

virtual~hoge(){} hoge&operator=(const hoge&s1) { m_str1=s1.m_strS1; m_str2 =s1.m_str2; return *this; } bool operator==(const hoge&s1)const { return &s1==this; }

public:
CString m_str1;
CString m_str2;
public:
void Setstr1 (CString val){m_str1=val;}
void Setstr2 (CString &val){m_str2=val;}
CString Querystr1(){return m_str1;}
CString Querystr2(){return m_str2;}
};

//----------------------------------------------------------
//hogeリスト
//----------------------------------------------------------
class hogeList :public CList<hoge,hoge&>
{
public:
hogeList(){}
virtual~hogeList(){}
hogeList&operator=(const hogeList&s1)
{

if(this == &s1) { return *this; } RemoveAll(); POSITION pos; pos = s1.GetHeadPosition(); for(;pos;) { hoge&item = (hoge&)s1.GetNext(pos); AddTail(item); } return *this; }

};
//----------------------------------------------------------
//hogehogehogeクラス
//----------------------------------------------------------
class hogehogehoge
{
public:
hogehogehoge(){}
virtual ~hogehogehoge(){}
hogehogehoge&operator=(const hogehogehoge&s1)
{
m_str3 = s1.m_str3;
m_lshoge= s1.m_lshoge;
return *this;
}
bool operator==(const hogehogehoge&s1)const
{
return &s1 == this;
}

public:
CString m_str3 ; //
hogeList m_lshoge; //

public:
void Setstr3 (CString &val){m_str3 =val;}
void Setlshoge (ChogeList &val){m_lshoge=val;}
CString &Querystr3 (){return m_str3 ;}
hogeList &Querylshoge (){return m_lshoge ;}
};

//----------------------------------------------------------
//メイン
//----------------------------------------------------------
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
hogehogehoge HOGEHOGEHOGE
HOGEHOGEHOGE.Setstr3="あいさつ"

//悩んでいるところ
hoge HOGE
HOGE.Setstr1 = "おはよう"
HOGE.Setstr2 = "こんにちわ"
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

hogehogehogeクラスのhogelistの中に値を入れたい

該当処理の後に、下記コードを意図していますか?

C++

1HOGEHOGEHOGE.m_lshoge.AddTail(HOGE);

hogeクラスに直接値をいれると自動的にhogehogehogeクラスのhogeリストにも
値が入るのかなと思い、下記のように書いてみましたがダメでした。

入りません。(どうもオブジェクト指向での「クラス」と「インスタンス」を混同されているように見受けられますので、一度整理して理解された方が良いと思います。)


題意とは直接関係しませんが、コードレビュー的な観点でのコメントです。重篤なものから列挙してみました。

  • 比較演算子(operator==)の実装が誤っています。ポインタ値の等値比較では、意図した結果にならず、バグの温床になります。
  • CList<hoge,hoge&>を継承したクラスを宣言するのは適切でありません。(そのような用途で設計されたクラスではありません。)
  • publicメンバ変数にアクセサ関数を用意する意味がありません。publicメンバ変数のみとするか、privateメンバ変数+アクセサ関数の方が一般的です。
  • コーディング規約や個人の趣向によるところが大きいですが、変数名やクラス名の命名規則があまり適切ではありません。大文字のみの変数名は避けた方が無難です。(マクロ名と混同します)

投稿2016/04/23 02:13

yohhoy

総合スコア6191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugar4006

2016/04/23 02:56

ご回答ありがとうございます。 HOGEHOGEHOGE.m_lshoge.AddTail(HOGE); の意図で合っています。 「クラス」と「インスタンス」について、もう一度勉強し直したいと思います。 ・operatorについて 誤っていることに気がづきませんでした。ご指摘ありがとうございます。 ・CListを継承したクラスの宣言について この書き方はあまり適切ではないのですね。 業務を通じてこのようなプログラムを作成しているのですが、 この書き方がなぜ共通化されているのか、先輩に聞いてみたいと思います。 ・publicメンバ変数について privateメンバ変数+アクセサ関数に変更したいと思います。 上記に変えるとすると、「HOGEHOGEHOGE.m_lshoge.AddTail(HOGE);」はどのようにすれば良いのでしょうか?理解不足で申し訳ございません。 ・コーディング規約について 質問用に適当につけてしまっておりました。気を付けたいと思います。
yohhoy

2016/04/23 03:20 編集

> ・CListを継承したクラスの宣言について 推測ですが、代入演算子(operator=)で「リスト全体のコピー操作」をサポートしたいのでしょう。このような利用用途なら、Chironian さん回答にある std::list を使った方が良いです。(既存コードベースがMFCべったりなら、規約的にも移行は難しいでしょうけど...) > ・publicメンバ変数について アクセサ関数経由なら HOGEHOGEHOGE.Querylshoge().AddTail(HOGE); となります。 # ここから余談:MFCのクラス設計は非常に古風なため、これからC++を学習する用途には全く向いていません。特にCListなどのコレクションクラスの設計は(今となっては)酷いものです。事情が許すなら、せめてコレクションクラスだけはC++標準ライブラリ(いわゆるSTL)を使った方が良いです。
guest

0

こんにちは。

hogehogehogeが「hogeクラスのインスタンス」を要素とするリストを保持しているのですね。
一般にリストに要素を追加する場合、add()のような関数を用いてインスタンスを追加する必要が有ります。
恐らくMFCをお使いのようですが、MFCのCListクラスでは、AddHead()もしくはAddTail()を使って追加することが必要です。

ところで、MFCはやはり何か必要があって学習されているのでしょうか?
もし、技術力を付けるための学習であれば、MFCは避けた方がよいのではないかと思います。
Visual C++でのみ使えるライブラリですので、使える場面が強く限定されますし、WEB情報が少ないです。
MFCで開発されたソフトウェアをメンテナンスする立場であればそうも言ってられませんが。

さて、C++の標準ライブラリには様々な便利な機能が多数用意されています。
もちろんリスト(std::list)もありますし、WEB情報も豊富です。立場的に可能でしたらstd::listを学習されることをお勧めします。

投稿2016/04/23 02:13

編集2016/04/23 02:18
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugar4006

2016/04/23 02:26

ご回答ありがとうございます。 仕事上MFCを使うので勉強している次第ですが、参考にできるものが少なく困っておりました。AddHead()やAddTail()等、試して理解を進めたいと思います。 標準ライブラリも合わせて学習を進めたいと思います。ありがとうございました!
guest

0

ベストアンサー

やりたいことは

  • hogehogehogeクラスのインスタンスHOGEHOGEHOGEのメンバm_lshogeに値を追加したい

であってますか?だとしたら

C++

1int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 2{ 3 hogehogehoge HOGEHOGEHOGE; 4 HOGEHOGEHOGE.Setstr3="あいさつ"; 5 6 hoge HOGE; 7 HOGE.Setstr1 = "おはよう"; 8 HOGE.Setstr2 = "こんにちわ"; 9 10 HOGEHOGEHOGE.m_lshoge.AddTail(HOGE); 11} 12

とするか

C++

1int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 2{ 3 hogehogehoge HOGEHOGEHOGE; 4 HOGEHOGEHOGE.Setstr3="あいさつ"; 5 6 hoge HOGE; 7 HOGE.Setstr1 = "おはよう"; 8 HOGE.Setstr2 = "こんにちわ"; 9 10 hogelist lhoge; 11 lhoge.AddTail(HOGE); 12 13 HOGEHOGEHOGE.Setlshoge(lhoge); 14}

でどうでしょう。

あまり直接の回答は質問者さんのスキルアップのためにならないと思いましたが、
初心者でハマっているのかもしれないと思い、書いてみました。

まずMFCのコンテナクラスのリファレンス(MSDN)をよく読んで、サンプルコードも
参考にして使い方をマスターしてみてください。

投稿2016/04/23 03:50

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sugar4006

2016/04/23 03:58

へたくそな説明にも関わらず、丁寧なご回答ありがとうございます。 やりたいことが上手く説明できず、四苦八苦しておりました。 使い方をマスターできるようリファレンス(MSDN)の学習を行いたいと思います。 やりたいことへの道筋が見えました。回答を頂けた3名の方誠にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問