検索エンジンを起動しましたが、問題に対応する答えが見つかりません。
基本的に、マップが必要です。各エントリには構造体のリストが含まれています。構造体自体には、2つstd::string
の変数と1つのが含まれていstd::list<string>
ます。
構造体内のリストにアクセスしているにもかかわらず、すべてが期待どおりに機能します。
1つのメソッド(ここではgetRules)は、必要に応じてマップエントリを作成し、それにリストを添付して、それに1つの構造体(ここではRule)要素を追加します。このメソッド内で別のメソッド(ここではgetRuleParams)が呼び出され、構造体内のリストへの要素の追加を処理する必要があります。
getRuleParamsメソッド内で、要素が追加されたリストには、struct要素を介して直接アクセスできます。「sourrounding」メソッド内では、要素が追加されたリストにも、struct要素を介して直接アクセスできます。
しかし、構造体のリストにアクセスしたい場合、またはより適切にはリスト要素にアクセスしたい場合は、奇妙なことが起こります。アドレスが変更されたことがわかりました(構造体、構造体内のリスト....)
あなたは私のコードが生成する出力でそれを見ることができます(それが正しくコーディングされていると仮定して)。
私はC++を初めて使用するので、非常に簡単で重要なものが欠けている可能性があります。呼び出されるいくつかのコピーコンストラクターと関係がありますが、すべての「変数」へのポインターのみを使用した場合と同じ動作になるのはなぜですか?
ここの誰かが私を啓発してくれることを本当に願っています。
私は自分の問題を可能な限り単純化/分離しました。(メソッドのシグネチャはそのようにする必要があります。たとえばvoid*
、他の関数に依存しているためです)
以下のコードを参照し、事前に感謝します。
#include <list>
#include <map>
#include <string>
#include <iostream>
using namespace std;
struct Rule {
string target;
string action;
list<string> params;
};
static int getRuleParams(void *prule) {
Rule* rule = (Rule*) (prule);
string param = "Entry!";
//Fill struct with ruleparams
rule->params.push_back(param);
cout << "Method getRuleParams()\n" << "parameter: "
<< *(rule->params.begin()) << " \nadress of rule:\t\t\t" << rule
<< " \nadress of rule.params:\t\t" << &(rule->params) << std::endl
<< std::endl;
return 0;
}
static int getRules(void *dbpolicies) {
string policy = "FileIO";
string target = "TARGET";
string action = "DENY";
std::map<std::string, std::list<Rule> >* policies = (std::map<std::string,
std::list<Rule> >*) (dbpolicies);
//Create std::list<DBRule> (list) for Policy Map-Entry, if not existing
if ((*policies).find(policy) == (*policies).end())
(*policies)[policy] = std::list<Rule>();
//Fill struct
Rule rule = { target, action };
(*policies).find(policy)->second.push_back(rule);
//call Method which manipulates params in struct
getRuleParams(&rule);
cout << "Method getRulesforPackage() (access rule directly):";
cout << "\nparameter = " << *(rule.params.begin())
<< "\naddress of rule:\t\t" << &rule;
cout << "\nadress of rule.params:\t\t" << &(rule.params) << std::endl
<< std::endl;
cout << "Method getRulesforPackage() access rule via map:" << std::endl;
//READ params from map entry -> EVIL
std::list<Rule> dbrules = (*policies).find(policy)->second;
Rule firstrule = *dbrules.begin();
std::list<std::string> dbruleparams = firstrule.params;
string ruleparam = *(firstrule.params.begin()); //EVIL!
// string ruleparam = *(dbruleparams.begin()); // <- REALLY EVIL! (program crashes)
//Variant 2: pointers only
std::list<Rule>* dbrules2 = &(*policies).find(policy)->second;
Rule* firstrule2 = &*(dbrules2->begin());
std::list<std::string>* dbruleparams2 = &(firstrule2->params);
cout << "rule.target = " << firstrule.target << "\nrule.action = "
<< firstrule.action << std::endl;
cout << "address of rule:\t\t" << &firstrule << std::endl;
cout << "address of rule (pointer):\t" << firstrule2 << std::endl;
// string ruleparam2 = *(dbruleparams2->begin()); //REALLY EVIL! (program crashes)
// cout << "parameter: " << ruleparam << std::endl;
// cout << "parameter (pointer): " << ruleparam2 << std::endl;
return 0;
}
static std::map<std::string, std::list<Rule> > getPolicies() {
std::map<std::string, std::list<Rule> > policies;
getRules(&policies);
return policies;
}
int main() {
std::map<std::string, std::list<Rule> > policies = getPolicies();
}