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

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

ただいまの
回答率

90.47%

  • C++

    3608questions

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

  • VC++

    137questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,549

sugar4006

score 5

こんにちは。現在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 = "こんにちわ"                              
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

こんにちは。

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/23 11:26

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

    キャンセル

+1

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

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

HOGEHOGEHOGE.m_lshoge.AddTail(HOGE);

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/23 11:56

    ご回答ありがとうございます。

    HOGEHOGEHOGE.m_lshoge.AddTail(HOGE);
    の意図で合っています。
    「クラス」と「インスタンス」について、もう一度勉強し直したいと思います。

    ・operatorについて
    誤っていることに気がづきませんでした。ご指摘ありがとうございます。

    ・CListを継承したクラスの宣言について
    この書き方はあまり適切ではないのですね。
    業務を通じてこのようなプログラムを作成しているのですが、
    この書き方がなぜ共通化されているのか、先輩に聞いてみたいと思います。

    ・publicメンバ変数について
    privateメンバ変数+アクセサ関数に変更したいと思います。
    上記に変えるとすると、「HOGEHOGEHOGE.m_lshoge.AddTail(HOGE);」はどのようにすれば良いのでしょうか?理解不足で申し訳ございません。

    ・コーディング規約について
    質問用に適当につけてしまっておりました。気を付けたいと思います。

    キャンセル

  • 2016/04/23 12:14 編集

    > ・CListを継承したクラスの宣言について
    推測ですが、代入演算子(operator=)で「リスト全体のコピー操作」をサポートしたいのでしょう。このような利用用途なら、Chironian さん回答にある std::list を使った方が良いです。(既存コードベースがMFCべったりなら、規約的にも移行は難しいでしょうけど...)

    > ・publicメンバ変数について
    アクセサ関数経由なら HOGEHOGEHOGE.Querylshoge().AddTail(HOGE); となります。

    # ここから余談:MFCのクラス設計は非常に古風なため、これからC++を学習する用途には全く向いていません。特にCListなどのコレクションクラスの設計は(今となっては)酷いものです。事情が許すなら、せめてコレクションクラスだけはC++標準ライブラリ(いわゆるSTL)を使った方が良いです。

    キャンセル

checkベストアンサー

0

やりたいことは

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

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

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    hogehogehoge HOGEHOGEHOGE;
    HOGEHOGEHOGE.Setstr3="あいさつ";

    hoge  HOGE;
    HOGE.Setstr1 = "おはよう";
    HOGE.Setstr2 = "こんにちわ";

    HOGEHOGEHOGE.m_lshoge.AddTail(HOGE);
}


とするか

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) 
{ 
    hogehogehoge HOGEHOGEHOGE;
    HOGEHOGEHOGE.Setstr3="あいさつ";

    hoge  HOGE;
    HOGE.Setstr1 = "おはよう";
    HOGE.Setstr2 = "こんにちわ";

    hogelist lhoge;
    lhoge.AddTail(HOGE);

    HOGEHOGEHOGE.Setlshoge(lhoge);
}


でどうでしょう。

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/23 12:58

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

    やりたいことへの道筋が見えました。回答を頂けた3名の方誠にありがとうございます。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • C++

    3608questions

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

  • VC++

    137questions

    VC++ (Visual C++) とは、Microsoft製のC++のための統合開発環境です。