2016-04-06 7 views
-5

私は構造体を持っているので、別のメソッドでその中から特定の値にアクセスしたいと思います。私は構造体自体を変更することは許されていません。ここには構造体とその初期化とアクセスに使用される2つの関数があります。sctructから特定の値を取得するC++

struct StdCardConfirmationReceipt 
{ 
private: 
    std::string sOfrIdOrderCentral; 
    std::string sOrderIdOrderCentral; 
    std::string sFulfillmentOrderIdOrderCentral; 

public: 
    StdCardConfirmationReceipt() 
    {  
     sOfrIdOrderCentral = ""; 
     sOrderIdOrderCentral = ""; 
     sFulfillmentOrderIdOrderCentral = ""; 
    } 

    StdCardConfirmationReceipt& operator=(const StdCardConfirmationReceipt& source) 
    { 
     sOfrIdOrderCentral     = source.sOfrIdOrderCentral; 
     sOrderIdOrderCentral    = source.sOrderIdOrderCentral; 
     sFulfillmentOrderIdOrderCentral  = source.sFulfillmentOrderIdOrderCentral; 
    } 

私は、これらの値は「sOFrIDOrderCentral」とsFulfillmentOrdIdOrderCentral」を取得し、別の構造体に入れたいと思います。これは上記のコードで可能ですか?ここでは、私が構造体にアクセスするために他のメソッドで使用しているfor-loopを示します。

for(std::vector<StdCardConfirmationReceipt>::iterator vIter= mvCardConfirmationReceiptList.begin(); vIter != mvCardConfirmationReceiptList.end(); ++vIter) 
{ 
    //need to accesss OFrIDOrderCentral and sFulfillmentOrdIdOrderCentral 
} 
+3

もっと*ここでの例はかなり良いでしょう。それらはプライベートプロパティなので、アクセサーメソッドを作成します。 – tadman

+0

@kfsone構造体のすべてのデータメンバーはprivateです。 – NathanOliver

+0

このような構造体では、コンストラクタを記述して演算子を割り当てる必要はありません。 – AnatolyS

答えて

0

は残念ながら、これらのすべてのメンバーはプライベートなのでは、クラスの外部からアクセスすることはできません。あなたはアクセサ関数を記述するか必要があります:

#include <vector> 
#include <iostream> 

struct StdCardConfirmationReceipt { 
private: 
    std::string sOfrIdOrderCentral; 
public: 
    StdCardConfirmationReceipt() : sOfrIdOrderCentral() {} 
    StdCardConfirmationReceipt(std::string s) : sOfrIdOrderCentral(s) {} 
public: 
    const std::string& getsOfrIdOrderCentral() const { return sOfrIdOrderCentral; } 
}; 

int main() { 
    std::vector<StdCardConfirmationReceipt> vec; 
    vec.push_back(StdCardConfirmationReceipt("1")); 
    vec.push_back(StdCardConfirmationReceipt("2")); 
    vec.push_back(StdCardConfirmationReceipt("3")); 
    for (auto vIter = vec.begin(); vIter != vec.end(); ++vIter) { 
     std::cout << vIter->getsOfrIdOrderCentral(); 
    } 
} 

http://ideone.com/kdwyWL

+0

私はOPのサンプルに近い関係を好むだろう。 _variables_を保持するための 'std :: map 'のようなものかもしれません。 –

+0

@πάνταῥεhis彼の質問には地図はありませんでしたが、私は自分の答えをもっと正常にしました。 – kfsone

+0

あなたは*実際にプライベートなメンバーにアクセスできるので、私はこれをdownvotingしています。あなたの質問に対する答えは確かにノーであるべきですが、それは尋ねられたものではありません。 – M2tM

-1

あなたがアクセスしたいプライベートデータメンバを持つ構造体を持っている場合、あなたは常に#define private public右と構造体定義の前にようにそれらにアクセスすることができます正常。可能であれば、これは非常に悪い習慣であるため、アクセサ関数を使用してください。

+1

未定義の振る舞いを意図的に呼び出すことは、クヌスを6ヶ月間読むことによって罰せられます。 Upvoter、あなたに恥をかく。 – SergeyA

+0

ここでは未定義の動作は何ですか?私はこれが恐ろしい習慣であることを知っていますが、定義された行動でなければなりません。 – fuzzything44

+0

アクセス修飾子を置き換えることによって、クラス定義が変更されます。今、もし同じヘッダーファイルがそのようなひどいことが行われていない別の翻訳単位に含まれていれば、2つの翻訳単位で別々に定義されたクラスになります。 Ka-Boom。 – SergeyA

1

http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html

基本的に、あなたはプライベートメンバーにアクセスするために求めています。それは陳腐にならないことを確認するために、リンクの完全なソースを引用すると:

#include <iostream> 
using namespace std; 

template<typename Tag> 
struct result { 
    /* export it ... */ 
    typedef typename Tag::type type; 
    static type ptr; 
}; 

template<typename Tag> 
typename result<Tag>::type result<Tag>::ptr; 

template<typename Tag, typename Tag::type p> 
struct rob : result<Tag> { 
    /* fill it ... */ 
    struct filler { 
    filler() { result<Tag>::ptr = p; } 
    }; 
    static filler filler_obj; 
}; 

template<typename Tag, typename Tag::type p> 
typename rob<Tag, p>::filler rob<Tag, p>::filler_obj; 

struct A { 
private: 
    void f() { 
    std::cout << "proof!" << std::endl; 
    } 
}; 

struct Af { typedef void(A::*type)(); }; 
template class rob<Af, &A::f>; 

int main() { 
    A a; 
    (a.*result<Af>::ptr)(); 
} 

を基本的にこの方法を使用すると、あなたが望むものを達成するであろう。しかし、これをしてはいけません。カプセル化が中断され、非常に脆いコードが作成されます。

これは信じられないメンテナンスの頭痛を引き起こす可能性があり、一般的に恐ろしいプログラミング練習です。あなたの答えが非常に多くのdownvotesを得た理由は、あなたが言語に組み込まれている情報隠蔽の仕組みを覆すならばひどいコードを助長するからです。

+0

私はまだこれを理解しようとしています: 'template class rob ;'どうしてコンパイルエラーではないのですか?そのような方法でプライベートメンバーにアクセスするには?標準からの言葉でこれを許していますか? – SergeyA

+0

標準の言葉では、それは認められません。私は、あなたがこの構文を可能にする箇所を引用するために、言語標準に十分に精通していません。それによると、引用符で囲まれた通路https://books.google.com/books?id=0klsAQAAQBAJ&pg=PA454&lpg=PA454&dq=C%2B%2B+protects+against+accident+rather+than+deliberate+circumvention+(詐欺)&ソース= BL&OTS = S1r6-byH0P&SIG = yNtFfzBDL6hCL7W1FtVq4Pkme8Y&HL = EN&SA = X&VED = 0ahUKEwjk2dKnx4fMAhUNymMKHbnVDSQQ6AEIHTAA#V = 1ページ分&Q = C%2B%2B%20protects%20against%20accident%20rather%20than%20deliberate%20circumvention%20(不正)&F =偽 – M2tM

+0

"C++は偶発的な迂回(詐欺)ではなく事故からの保護" -Bjarne Stroustrup – M2tM

関連する問題