0

カスタムタイプ A のオブジェクトがあります (std::string、vector などの多くのメンバーを持ち、生のポインターを持たないクラス)。

これで、A オブジェクトのリストができました。

A tmpobj;  
std::list<A> temp;

std::list::remove 関数を呼び出して、リストから特定のオブジェクトを削除したい場合

temp.remove(tmpobj)

さて、ここに私の質問があります

  1. == 演算子をオーバーロードする必要があると想定しています。必要がない場合、およびデフォルトの == が機能する場合はお知らせください。それについてはよくわかりません。STL ベースのメンバーがなくても機能することはわかっています
  2. < 演算子は既にオーバーロードされています。それでも、「==」演算子を提供する必要があると思います。これは正しいですか。1 つの引数が可能で、「==」を「<」演算子の 2 回の呼び出しとして決定できます。

    if(a < b || b < a) false を返す そうでなければ true を返します。

または、2回の呼び出しを行うのは非効率的であるか、それ以外の理由があるため、これは行われません。


以下のコード スニペットで試してください。

js

 function ValidateValidation(cmb, chk, lbl) {

            cmb = $find(cmb);
            chk = document.getElementById(chk);
            lbl = document.getElementById(lbl);
            if (chk.checked) {
                if (cmb.get_value() != null && cmb.get_value() != "" && cmb.get_selectedIndex() >= 0) {
                    debugger;
                    return true;
                }
                else {
                    lbl.style.display = '';
                    return false;
                }
            }
            else {
                lbl.style.display = 'none';
                return true;
            }


        }

aspx

 <telerik:GridTemplateColumn>
                    <EditItemTemplate>
                        <asp:CheckBox ID="CheckBox1" runat="server" />
                        <telerik:RadComboBox ID="RadComboBox1" runat="server">
                            <Items>
                            </Items>
                        </telerik:RadComboBox>
                        <asp:Label ID="Label1" runat="server" ForeColor="Red" Text="your messege" Style="display: none;"></asp:Label>
                    </EditItemTemplate>
                </telerik:GridTemplateColumn>

aspx.cs

  protected void RadGrid1_ItemDataBound(object sender, GridItemEventArgs e)
{
    if (e.Item is GridEditableItem && e.Item.IsInEditMode)
    {
        GridEditableItem item = e.Item as GridEditableItem;
        CheckBox CheckBox1 = item.FindControl("CheckBox1") as CheckBox;
        Label Label1 = item.FindControl("Label1") as Label;
        RadComboBox RadComboBox1 = item.FindControl("RadComboBox1") as RadComboBox;

        (item.FindControl("UpdateButton") as LinkButton).Attributes.Add("onclick", "return ValidateValidation('" + RadComboBox1.ClientID + "','" + CheckBox1.ClientID + "','" + Label1.ClientID + "');");

    }
}
4

2 に答える 2

1

n3337 23.3.5.5

void remove(const T& value);

template <class Predicate> void remove_if(Predicate pred);

効果: リスト反復子 i によって参照されるリスト内のすべての要素を消去します。これらの要素について、*i == value , pred(*i) != falseという条件が成立します。イテレータと消去された要素への参照のみを無効にします。

operator ==したがって、オーバーロードまたは述語が必要です。

于 2012-08-31T10:54:28.250 に答える
1

デフォルトはありoperator==ませんので、心配しないでください。クラスに がないとコンパイラが不平を言うときは、operator==それを実装してください ;-)

クラスのすべての可能な値が一緒になって、「完全に順序付けられた」という数学的プロパティを持つセットを表す場合operator==、 の観点から実装できますoperator<。これは必ずしも最も効率的な方法ではありませんが、C++ がそれを想定していない主な理由は、一般に、さまざまなオーバーロードされた演算子が互いにどのように関係するかについて何も想定していないためです。すべての型が必ずしも完全順序集合を表しているわけではありません。良くも悪くも、C++ では を使用operator<して半順序を表すことができます。

于 2012-08-31T10:55:43.273 に答える